English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
سأبدأ بإعطاء صورة توضيحية:
عند الحديث عن تأثير عرض العرض التلقائي باستخدام ViewPager، فإن PagerAdapter هو ضروري، لذا سأقوم أولاً بشرح هذا الكلاس.
مقدمة لـ PagerAdapter
مكتبة PagerAdapter هي كلاس موجود في مكتبة Android.support.v4، وهو كلاس تعريفي يستمر في Object، يمكنك استخدامه عن طريق إدخال مكتبة android.support.v4.view.PagerAdapter.
مكتبة PagerAdapter هي مكتبة مخصصة لـ viewPager، حيث أن viewPager نفسه هو عنصر قوي تم إضافته إلى مكتبة android.support.v4، يمكنه تنفيذ تأثيرات التمرير مثل تأثير التمرير في الشريط الإعلاني الشائع في التطبيقات، يمكن تنفيذ هذا التأثير باستخدام viewPager. اليوم سأقوم بشرح كيفية استخدام viewPager وكتابة مكتبة PagerAdapter لتنفيذ تأثير التمرير للشريط الإعلاني.
既然是个抽象类,那么我们新建一个类去继承它,重写四个方法:
1.public Object instantiateItem(ViewGroup container, int position)
2.public void destroyItem(ViewGroup container, int position, Object object)
3.public int getCount()
4.public boolean isViewFromObject(View arg0, Object arg1)
MyViewPagerAdapter类:
public class MyViewPagerAdapter extends PagerAdapter { private List<ImageView> mList; public MyViewPagerAdapter(List<ImageView> mList){ this.mList=mList; } //当要显示的图片进行缓存时,会调用这个方法进行显示图片的初始化 //我们将要显示的ImageView加入到ViewGroup中 public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub container.addView(mList.get(position)); return mList.get(position); } @Override //PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁 public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-generated method stub container.removeView(mList.get(position)); } //获取要滑动的控件的数量, public int getCount() { // TODO Auto-generated method stub return mList.size(); } //来判断显示的是否是同一张照片,这个我们将两个图片对比 再返回 public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0==arg1; } }
activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="200dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBottom="@id/vp" android:background="#33000000" android:orientation="vertical" android:paddingBottom="10dp" > <LinearLayout android:id="@+id/ll_points" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="horizontal" android:paddingBottom="10dp" > </LinearLayout> </LinearLayout> </RelativeLayout>
MainActivity:
public class MainActivity extends Activity { private ViewPager mVp; //private TextView tvTitle; private LinearLayout llPoints; //private String[] titles;// احتوي على جميع العناوين التي يجب عرضها private int[] images;// احتوي على جميع ids للموارد الصور التي يجب عرضها private List<ImageView> list=new ArrayList<ImageView>();;// احتوي على جميعImageView التي يجب عرضها في عنصرViewPager private int prevPosition = 0; private Handler handler = new Handler() { @SuppressLint("HandlerLeak") public void handleMessage(android.os.Message msg) { switch (msg.what) { case 0: // الحصول على مؤشر الصفحة الحالية للمvp int currentItem = mVp.getCurrentItem(); // هو مؤشر الصفحة التالية التي سيتم عرضها currentItem++; // إعداد صفحة العرض لـ ViewPager mVp.setCurrentItem(currentItem % list.size()); break; default: break; } }; }; @SuppressWarnings("deprecation") protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); // titles = getTitles(); images=getImages(); for (int i = 0; i < images.length; i++) { ImageView iv=new ImageView(this); iv.setBackgroundResource(images[i]); list.add(iv); // حسب عدد الصور يتم إنشاء عدد متناسب من النقاط الدائرية الصغيرة final View view=new View(this); view.setBackgroundResource(R.drawable.login__05); DisplayMetrics metrics=new DisplayMetrics(); float width=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,30, metrics); float height=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 30, metrics); LinearLayout.LayoutParams params=new LinearLayout.LayoutParams((int)width,(int)height); params.leftMargin=5; view.setLayoutParams(params); llPoints.addView(view); } //设置第一页显示的标题 //tvTitle.setText(titles[0]); //设置第一页的时候,小圆点显示的背景图 llPoints.getChildAt(0).setBackgroundResource(R.drawable.login__03); //下面封装viewpager的适配器 MyViewPagerAdapter adapter=new MyViewPagerAdapter(list); mVp.setAdapter(adapter); //设置ViewPager对象页面变化时的监听 mVp.setOnPageChangeListener(new OnPageChangeListener() { @Override //当下一个页面被选择的时候 public void onPageSelected(int arg0) { // TODO Auto-generated method stub //tvTitle.setText(titles[arg0%list.size()]); llPoints.getChildAt(prevPosition).setBackgroundResource(R.drawable.login__05); llPoints.getChildAt(arg0).setBackgroundResource(R.drawable.login__03); //把当前点位置做为下一次变化的前一个点的位置 prevPosition=arg0; } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (true) { SystemClock.sleep(3000); handler.sendEmptyMessage(0); } } }).start(); } private void initView() { // TODO Auto-generated method stub mVp = (ViewPager) findViewById(R.id.vp); //tvTitle = (TextView) findViewById(R.id.tv_title); llPoints = (LinearLayout) findViewById(R.id.ll_points); } private int[] getImages(){ return new int[]{R.drawable.banner_01,R.drawable.banner_02,R.drawable.banner_03}; } }
هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في تعلم جديد، ونأمل أيضًا أن تدعموا وتشجعوا تعليمات呐喊.
بيان: محتوى هذا المقال تم جمعه من الإنترنت، يحق لصاحب الحقوق الحصول عليه، يتم جمع المحتوى من قبل المستخدمين عبر الإنترنت الذين يقدمونه بذاتهم ويتم تحميله، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي ولا يتحمل المسؤولية القانونية المتعلقة بذلك. إذا اكتشفتم محتوى يشتبه في حقوق النسخ، مرحبًا بكم في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) لإبلاغنا، وقدموا الدليل على ذلك، وسيتم حذف المحتوى المزعوم الذي يشتبه في حقوق النسخ على الفور.