android防新聞迴圈輪播圖效果
阿新 • • 發佈:2019-01-25
前天有朋友問我說實現類似新聞輪播圖片的效果該怎麼實現?有什麼框架比較好一點。我想這不用什麼框架,自己寫一個就可以實現吧!好了,廢話不多說,先看一下實現的效果圖,再上程式碼。
實現的效果圖
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);
}
}
}