1. 程式人生 > >android防新聞迴圈輪播圖效果

android防新聞迴圈輪播圖效果

       前天有朋友問我說實現類似新聞輪播圖片的效果該怎麼實現?有什麼框架比較好一點。我想這不用什麼框架,自己寫一個就可以實現吧!好了,廢話不多說,先看一下實現的效果圖,再上程式碼。
這裡寫圖片描述
實現的效果圖

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:id="@+id/viewPager" android:layout_height="match_parent"/> <LinearLayout android:layout_width="wrap_content"
android:orientation="horizontal" android:layout_alignParentBottom="true" android:id="@+id/circleLayout" android:gravity="center" android:paddingBottom="30dp" android:layout_centerHorizontal="true" android:layout_height="wrap_content"
> </LinearLayout> </RelativeLayout> </RelativeLayout> ScrollPagerAdapter.java public class ScrollPagerAdapter extends PagerAdapter { private Context context; private int[] mIamgeId; private ImageView[] mImageViews; public ScrollPagerAdapter(Context context, int[] mIamgeId) { this.mIamgeId = mIamgeId; this.context = context; mImageViews = new ImageView[mIamgeId.length]; for (int i = 0; i < mIamgeId.length; i++) {//通過傳進來的圖片數量來確定給父佈局新增多少個子佈局ImageView來顯示圖片 mImageViews[i] = new ImageView(context); } } @Override public int getCount() { return Integer.MAX_VALUE;//這個值需要設定為這個,如果只是設定為mIamgeId.length,那麼久無法實現迴圈滾動 } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public Object instantiateItem(ViewGroup container, int position) { position = (position) % mIamgeId.length; ImageView iv = new ImageView(context); iv.setScaleType(ImageView.ScaleType.FIT_XY); iv.setImageResource(mIamgeId[position]); container.addView(iv);//裝載對應的ImageVIew return iv; } } MainActivity.java public class MainActivity extends Activity { private ViewPager mViewPager; private LinearLayout mCircleLayout;//存放滾動時小圓點的父佈局 private int[] mImageId = new int[]{R.mipmap.one, R.mipmap.two, R.mipmap.three, R.mipmap.four};//存放圖片id的陣列 private ScrollPagerAdapter mScrollPagerAdapter;//ViewPager的介面卡 private Context mContext; private int mPreviousEnabledPointPosition;//記錄上一張顯示圖片的位置 private PersonalHandler mHandler; //訊息處理器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; initView();//初始化view drawRadious();//給mCircleLayout佈局繪製對應的圓點,通過圖片的數量來繪製對應圓點的數目 startRunImage();//開始輪播條滾動 } //初始化View private void initView() { mViewPager = (ViewPager) findViewById(R.id.viewPager); mCircleLayout = (LinearLayout) findViewById(R.id.circleLayout); mScrollPagerAdapter = new ScrollPagerAdapter(mContext, mImageId); mViewPager.setAdapter(mScrollPagerAdapter); } //給mCircleLayout佈局繪製對應的圓點,通過圖片的數量來繪製對應圓點的數目 private void drawRadious() { //進行小圓點的繪製 mCircleLayout.removeAllViews(); View v; LinearLayout.LayoutParams params; int size = mImageId.length; for (int i = 0; i < size; i++) { v = new View(mContext); v.setBackgroundResource(R.drawable.scroll_point_bg); params = new LinearLayout.LayoutParams(15, 15); if (i != 0) { params.leftMargin = 10; } v.setLayoutParams(params); v.setEnabled(false); mCircleLayout.addView(v); } mPreviousEnabledPointPosition = 0; mCircleLayout.getChildAt(mPreviousEnabledPointPosition).setEnabled(true); mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { position = position % mImageId.length; mCircleLayout.getChildAt(mPreviousEnabledPointPosition).setEnabled(false); mCircleLayout.getChildAt(position).setEnabled(true); mPreviousEnabledPointPosition = position; } @Override public void onPageScrollStateChanged(int state) { } }); } //開始輪播條滾動 private void startRunImage() { if (mHandler == null) { mHandler = new PersonalHandler(); } else { // 把佇列中的所有的訊息和任務全部清除出佇列 mHandler.removeCallbacksAndMessages(null); } // 延時3秒鐘, 執行PersonalRunnable任務類中的run方法 mHandler.postDelayed(new PersonalRunnable(), 3000); } //訊息處理器 private class PersonalHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // 當前是在主執行緒中, 把輪播圖切換到下一頁面 int currentItem = (mViewPager.getCurrentItem() + 1) % mImageId.length; mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1); // 遞迴: postDelayed -> PersonalRunnable.run -> sendEmptyMessage -> handleMessage mHandler.postDelayed(new PersonalRunnable(), 3000); } } private class PersonalRunnable implements Runnable { @Override public void run() { mHandler.sendEmptyMessage(0); } } }