Bir Atlıkarınca gibi davranan Özel bir ViewPager'ım var; bu, bir sayfada birden fazla sayfa göstermek istiyorum. Bunu yapmak için biz 2 çözümler var: marjları setPageMargin() yöntemini Özel ViewPager merkezi geçerli öğesi, özel bir getPageWidth ile Bağdaştırıcıda
- Ya da benim ViewPager ait adaptörün getPageWidth yöntemini geçersiz kılar kullanabilirsiniz.
İlk çözüm harika çalışıyor ancak geçerli sayfamın yüzdesini tam olarak kesinleştirmek istiyorum. Sorun şu ki, getPageWidth çözümüyle mevcut sayfam solda değişiyor. Mantıklı, çünkü önceki büyüklüğünün sadece% 80'ini alıyor. Onun çalışma ama bu sadece gerçekten garip davranıyor, daha önce olduğu gibi kaydırma olamaz
@Override
public void scrollTo(int x, int y) {
x = (int) (x - (getWidth() - getWidth()*getAdapter().getPageWidth(getCurrentItem()))/2);
super.scrollTo(x, y);
}
, 'iyi yönde Don gitmez: Ben böyle benim özel ViewPager ait scrollTo fonksiyonunu geçersiz kılmak için çalıştı Parmağımı takip edin ... Çalışmakta olan bir kaydırma ve ortalanmış bir sayfama sahip olmamı sağlayan bir çözüm var mı? İşte
benim adaptör: Buradaimport android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import java.util.ArrayList;
public class CarouselAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener {
private ArrayList<Entity> mData = new ArrayList<>();
private ScaledRelativeLayout cur = null, next = null;
private float scale;
private MainActivity context;
private FragmentManager fragmentManager;
public CarouselAdapter(MainActivity context, FragmentManager fragmentManager, ArrayList<Entity> mData) {
super(fragmentManager);
this.fragmentManager = fragmentManager;
this.context = context;
this.mData = mData;
}
@Override
public float getPageWidth(int position) {
return (0.85f);
}
@Override
public Fragment getItem(int position) {
if (position == MainActivity.FIRST_PAGE) {
scale = MainActivity.BIG_SCALE;
} else {
scale = MainActivity.SMALL_SCALE;
}
position = position % mData.size();
Fragment fragment = CarouselFragment.newInstance(context, mData.get(position), position, scale);
return fragment;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (positionOffset >= 0f && positionOffset <= 1f) {
cur = getRootView(position);
cur.setScaleBoth(MainActivity.BIG_SCALE - MainActivity.DIFF_SCALE * positionOffset);
if (position < mData.size()-1) {
next = getRootView(position +1);
next.setScaleBoth(MainActivity.SMALL_SCALE + MainActivity.DIFF_SCALE * positionOffset);
}
}
}
@Override
public void onPageSelected(int position) {}
@Override
public void onPageScrollStateChanged(int state) {}
private ScaledRelativeLayout getRootView(int position) {
return (ScaledRelativeLayout) fragmentManager.findFragmentByTag(this.getFragmentTag(position)).getView().findViewById(R.id.rootItem);
}
private String getFragmentTag(int position) {
return "android:switcher:" + context.carousel.getId() + ":" + position;
}
}
Daha yararsız ama benim MainActivity geçerli:
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import java.util.ArrayList;
public class MainActivity extends FragmentActivity {
public static int FIRST_PAGE;
public final static float BIG_SCALE = 1.0f;
public final static float SMALL_SCALE = 0.85f;
public final static float DIFF_SCALE = BIG_SCALE - SMALL_SCALE;
public CarouselViewPager carousel;
private CarouselAdapter carouselAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FIRST_PAGE = mData.size()/2;
carouselAdapter = new CarouselAdapter(this, this.getSupportFragmentManager(), mData);
carousel = (CarouselViewPager) findViewById(R.id.carousel);
carousel.setAdapter(carouselAdapter);
carousel.addOnPageChangeListener(carouselAdapter);
carousel.setCurrentItem(Math.round(FIRST_PAGE));
carousel.setOffscreenPageLimit(3);
carousel.setClipToPadding(false);
carousel.setScrollDurationFactor(2.5f);
}
}
Düzenleme:
root.post(new Runnable() {
@Override
public void run() {
int width = root.getWidth();
Log.w("Post", "Width : " + width + ", newWidth : " + (width * 0.8));
// root.setPadding((int) (width * 0.125), 0, (int) (width * 0.125), 0);
ViewPager.LayoutParams params = (ViewPager.LayoutParams) root.getLayoutParams();
params.width = (int) (width * 0.8);
root.setLayoutParams(params);
root.requestLayout();
root.forceLayout();
root.invalidate();
}
});
Selamlar
yılında sayesinde yapabilirsiniz! Sadece bir sorum var, bunu yapmak için bir iş parçacığı kullanmak gerçekten uygun mu? Bunu yapmak istediğim, ana iş parçasında bir dolgu yapabilir miyiz ya da berbat mı? – zed13
'mRootView.getWidth();' görünüm zaten oluşturulmadığı ve genişliğinin Android tarafından hesaplanmadığı sürece çalışmaz. Bu ayrı bir iş parçacığı değil, UI iş parçacığı üzerinde çalışır, ancak yalnızca 'mRootView' tamamen oluşturuluncaya kadar ertelenir. – Sourabh
Oh evet isterseniz, bunun yerine screenWidth' işlevini kullanabilirsiniz, doğru, unuttum, bilgi için tekrar teşekkürler. İyi günler. – zed13