آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

سوال در مورد یک Custom Pager?

علی  11 سال پیش  11 سال پیش
+2 0

سلام : من در این کد می تونم با انگشت عکس ها رو ورق بزنم و ببینم . حالا می خوام خودش به صورت اتومات این کار رو بکنه و مثلا هر یک ثانیه عوض شه؟ کجای کد باید از 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);
    }

}
0 0
لطفا یکی راهنمایی کنه ؟ (11 سال پیش)
 برای این سوال 5 پاسخ وجود دارد.
پاسخ به سوال 
Vahid  11 سال پیش
+2 0

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();

0 0
ممنون از لطفتون من اینو تست کردم اجرا شد ول اصلا نرم کار نمی کنه؟ بایستی چه کار کرد؟ و بعدا می خوام از سرور بخونه این ها رو... (11 سال پیش)
پاسخ به سوال 
احسان منصوری  11 سال پیش
+1 0

از این متد استفاده کنید:

 
    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 ویوپیجر ننویسید. باید اونو داخل اکتیویتی که ویوپیجر رو توش استفاده کردید بنویسید

0 0
احسان جان ممنون ولی در این تیکه از کد نفهمیدم؟ باید متدد size رو اضافه کنم؟ (11 سال پیش)
پاسخ به سوال 
علی  11 سال پیش
0 0

 if(page >= imageIdis.size()){//به اندازه تعداد عناصر آرایه تون اسلایدشو میشه


0 0
شما واسه پر کردن ویوپیجرتون مگه از آرایه استفاده نکردین؟ خب توی همین اکتیویتی یه new ازش بزن و اندازشو بذار اینجایی که نوشتم. البته یه آرایه جدا بسازید براش که قضیه رو بهتر درک کنید. بعدا واسه خودتون کاستومش کنید. اینو اگه اجرا کردین، اطلاع بدین تا واسه نرم تر اجرا شدنش، کد افکت رو بذارم براتون (11 سال پیش)
0 0
بله اجرا شد ممنون . فقط به آخر که میریسه و می خواد برگرده به اول اصلا جالب بر نمی گرده (11 سال پیش)
0 0
جالب یعنی چطوری؟ خب باید افکت بهش بدین (11 سال پیش)
+1 0
این اسپم کیلر هم داستانیه واسه خودش. انگار آدم احساس میکنه داره چرت و پرت میگه. مگه ما اینجا داریم چیکار میکنیم که حرفامون سانسور میشه:) عجب (11 سال پیش)
0 0
آره واقعا. چه نوع افکتی بهتر روی این جواب میده ؟ (11 سال پیش)
0 0
آره واقعا. چه نوع افکتی بهتر روی این جواب میده ؟ (11 سال پیش)
+1 0
من یه افکت استفاده میکنم. بد نیس. الان نمیدونم کجا نوشتمش. امشب همه ی کدامو فراموش کردم. فردا ایشالا کامل براتون میذارم (11 سال پیش)
0 0
خیلی ممنون پس منتظرم فردا. راستی همین پروژه رو میشه از سرور راحت عکس ها رو خوند بی دردسر؟ (11 سال پیش)
0 0
آره من چند روز پیش اینکارو کردم. مشکلی نبود (11 سال پیش)
پاسخ به سوال 
احسان منصوری  11 سال پیش
+2 0

آقا علی اینم کلاس افکت به آیتم های ویوپیجر. بابت تاخیر هم معذرت میخوام

کلاسی به اسم 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());

 

سوالی بود در خدمتم. موفق و موید باشید

0 0
آقا احسان کد رو گذاشتم ولی این خطا رو میده. (11 سال پیش)
پاسخ به سوال 
علی  11 سال پیش
0 0

+1 0
شما چرا ویوپیجر رو با حرف بزرگ نوشتین؟ اون ویوپیجری که من نوشتم، کَست شده از ویوپیجر هست. اونو بنویسید (11 سال پیش)
0 0
آره درست شد ! این setAlpha روی api 8 جواب نمیده زدم api 15 . راهی هست روی همه api جواب بده؟ و این که میشه animation Fade_in رو برای این اجرا کرد؟ (11 سال پیش)
0 0
G.images را جایگزین mResources کردن ؟ اینو چطوری اینجا ok کنم؟ (11 سال پیش)
+1 0
این که دیگه یه آرایه استاتیک هستش. توی آموزش اسلاید تصویر، نحوه استفادشو توضیح دادن. (11 سال پیش)
0 0
از سرور میخونه تو log cat ولی نمیدونم تو این page چطوری بزارمش . بازم ممنون خیلی اذیتت کردم احسان جان (11 سال پیش)
0 0
اختیار داری شما. وظیفه بود (11 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .