سوال در مورد یک Custom Pager?
سلام : من در این کد می تونم با انگشت عکس ها رو ورق بزنم و ببینم . حالا می خوام خودش به صورت اتومات این کار رو بکنه و مثلا هر یک ثانیه عوض شه؟ کجای کد باید از therad یا handler استفاده کنم؟که با یه animation عوض بشه.
public class CustomPagerAdapter extends PagerAdapter {
int[] mResources = {
R.drawable.image1,
R.drawable.image2,
R.drawable.image3,
R.drawable.image4,
R.drawable.image5,
R.drawable.image6
};
Context mContext;
LayoutInflater mLayoutInflater;
protected Runnable itemView;
public CustomPagerAdapter(Context context) {
mContext = context;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return mResources.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((LinearLayout) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false);
ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);
imageView.setImageResource(mResources[position]);
container.addView(itemView);
return itemView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((LinearLayout) object);
}
}
thread رو باید در Activity که pager داخل اون قرار دارد و مقدار دهی شده است استفاده کنی. کد زیر رو به Activity اضافه کنید این کد هر یک ثانیه تصور pager رو یک item جلو می بره و وقتی به انتها رسید دوباره بر می گرده به ایتم اول.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
Thread.sleep(1000);
G.HANDLER.post(new Runnable() {
@Override
public void run() {
if (pager.getCurrentItem() >= adapter.getCount() - 1) {
pager.setCurrentItem(0, true);
} else {
pager.setCurrentItem(pager.getCurrentItem() + 1, true);
}
}
});
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
از این متد استفاده کنید:
Timer timer;
int page = 0;
public void pageSwitcher(int seconds) {
timer = new Timer(); // At this line a new Thread will be created
timer.scheduleAtFixedRate(new RemindTask(), 0, seconds * 1000); // delay
}
//kelase timer
class RemindTask extends TimerTask {
@Override
public void run() {
// As the TimerTask run on a seprate thread from UI thread we have
// to call runOnUiThread to do work on UI thread.
runOnUiThread(new Runnable() {
public void run() {
if (page >= imageIdis.size()) { //به اندازه تعداد عناصر آرایه تون اسلایدشو میشه
page = 0;
} else {
viewPager.setCurrentItem(page++);
}
}
});
}
}
و به این صورت اونو فراخوانی کنید:
pageSwitcher(4); //که عدد 4، فاصله بین صفحات هست
دقت کنید که این کدها رو داخل adapter ویوپیجر ننویسید. باید اونو داخل اکتیویتی که ویوپیجر رو توش استفاده کردید بنویسید
if(page >= imageIdis.size()){//به اندازه تعداد عناصر آرایه تون اسلایدشو میشه
آقا علی اینم کلاس افکت به آیتم های ویوپیجر. بابت تاخیر هم معذرت میخوام
کلاسی به اسم ZoomOutPageTransformer بسازید و کدهای زیر رو کپی کنید توش(البته کدهای اولیه هنگام تعریف کلاس رو هم پاک کنید)
public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
private static float MIN_SCALE = 0.85f;
private static float MIN_ALPHA = 0.5f;
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
int pageHeight = view.getHeight();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 1) { // [-1,1]
// Modify the default slide transition to shrink the page as well
float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
float vertMargin = pageHeight * (1 - scaleFactor) / 2;
float horzMargin = pageWidth * (1 - scaleFactor) / 2;
if (position < 0) {
view.setTranslationX(horzMargin - vertMargin / 2);
} else {
view.setTranslationX(-horzMargin + vertMargin / 2);
}
// Scale the page down (between MIN_SCALE and 1)
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
// Fade the page relative to its size.
view.setAlpha(MIN_ALPHA +
(scaleFactor - MIN_SCALE) /
(1 - MIN_SCALE) * (1 - MIN_ALPHA));
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
توی اکتیویتی که ویوپیجر تعریف شده، کلاس رو اینطوری فراخوانی کنید:
viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
سوالی بود در خدمتم. موفق و موید باشید
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
