概述: 要用ViewPager實現圖片輪播,主要是兩步: 1:用PagerAdapter使圖片可以滑動切換 2:用Handler來實現圖片自動輪播
頁面布局部分的代碼:
<?xml version="1.0" encoding="utf-8"?><android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawerlayout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_width="wrap_content" android:layout_height="150dp" android:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="fill_parent" android:layout_height="match_parent" /> <AbsoluteLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:id="@+id/viewgroup" android:layout_width="match_parent" android:layout_height="30dp" android:layout_alignParentRight="true" android:orientation="horizontal" android:gravity="right|bottom" android:layout_y="120d控制邏輯部分的java代碼:public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { PRivate MyHandler handler = new MyHandler(new WeakReference<>(this)); private ViewPager viewPaper; private ImageView[] tips = null; private ImageView[] imgs = null; private ViewGroup group; private int[] ids = new int[]{R.drawable.sc_1,R.drawable.sc_2,R.drawable.sc_3};//載入圖片 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); group = (ViewGroup)findViewById(R.id.viewgroup); viewPaper = (ViewPager)findViewById(R.id.viewPager); //將標識點裝載入ViewGroup中 tips = new ImageView[ids.length]; for(int i=0;i<ids.length;i++){ ImageView imageview = new ImageView(this); imageview.setLayoutParams(new LinearLayout.LayoutParams(7,7));//設置標識點的大小 tips[i] = imageview; if(i==0){//加載圖片 tips[i].setBackgroundResource(R.drawable.page_indicator_focused); }else{ tips[i].setBackgroundResource(R.drawable.page_indicator_focused); } //設置標識點的位置參數 LinearLayout.LayoutParams layoutparams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); layoutparams.leftMargin = 3; layoutparams.rightMargin = 3; group.addView(imageview,layoutparams); } group.bringToFront(); //將輪播圖片加載到數組中 imgs = new ImageView[ids.length]; for(int i=0;i<ids.length;i++){ ImageView imageview = new ImageView(this); imgs[i] = imageview; imageview.setBackgroundResource(ids[i]); } //設置Adapter viewPaper.setAdapter(new MyAdapter()); //設置監聽。主要是設置標識點背景 viewPaper.setOnPageChangeListener(this); viewPaper.setCurrentItem((imgs.length)*100); //啟動輪播 handler.sendEmptyMessageDelayed(MyHandler.MSG_UPDATE_IMG, MyHandler.MSG_DELAY); } public class MyAdapter extends PagerAdapter{ @Override public int getCount(){ return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View arg0, Object arg1){ return arg0 == arg1; } @Override public void destroyItem(View container,int position,Object object){// ((ViewPager)container).removeView(imgs[position % imgs.length]); } //載入圖片進去 @Override public Object instantiateItem(View container, int position){ position %= imgs.length; ImageView view = imgs[position % imgs.length]; ViewParent vp = view.getParent(); if(vp != null){ ViewGroup parent = (ViewGroup)vp; parent.removeView(view); } try { ((ViewPager) container).addView(imgs[position],0); }catch(Exception e){ } return imgs[position % imgs.length]; } } @Override public void onPageScrollStateChanged(int arg0) { switch(arg0){ case ViewPager.SCROLL_STATE_DRAGGING://正在滑動 handler.sendEmptyMessage(MyHandler.MSG_STOP_IMG); break; case ViewPager.SCROLL_STATE_IDLE://已經完成切換 handler.sendEmptyMessageDelayed(MyHandler.MSG_UPDATE_IMG,MyHandler.MSG_DELAY); break; default: break; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { setImageBackground(arg0 % imgs.length); handler.sendMessage(Message.obtain(handler,MyHandler.MSG_PAGE_OLD,arg0,0));//記錄切換到的頁碼 } /** * 設置選中的tip的背景 * @param selectItems */ private void setImageBackground(int selectItems){ for(int i=0; i<tips.length; i++){ if(i == selectItems){ tips[i].setBackgroundResource(R.drawable.page_indicator_focused); }else{ tips[i].setBackgroundResource(R.drawable.page_indicator_unfocused); } } } public class MyHandler extends Handler{ /* 請求輪播 */ protected static final int MSG_UPDATE_IMG = 1; /* 請求暫停輪播 */ protected static final int MSG_STOP_IMG = 2; /* 請求開始輪播 */ protected static final int MSG_START_IMG = 3; /* 記錄要開始輪播的頁號 */ protected static final int MSG_PAGE_OLD = 4; /* 輪播時間間隔 */ protected static final long MSG_DELAY = 1000; //使用弱引用 private WeakReference<MainActivity> weakReference; private int currentItem = 0; protected MyHandler(WeakReference<MainActivity> wk){ this.weakReference = wk; } public void handleMessage(Message msg) { super.handleMessage(msg); MainActivity activity = weakReference.get(); if(activity == null){ return; } //檢查并移除隊列中未發送的消息 if (activity.handler.hasMessages(MSG_UPDATE_IMG) && currentItem > 1){ activity.handler.removeMessages(MSG_UPDATE_IMG); } switch(msg.what){ case MSG_UPDATE_IMG: currentItem ++; //設置一個顯示圖片的下標,實現切換效果 activity.viewPaper.setCurrentItem(currentItem); //準備下次切換 activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMG,MSG_DELAY); break; case MSG_STOP_IMG: //不發送消息就暫停了 break; case MSG_START_IMG: activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMG,MSG_DELAY); break; case MSG_PAGE_OLD: //記錄頁號 currentItem = msg.arg1; break; default: break; } } }}新聞熱點
疑難解答