android 图片轮播
生活随笔
收集整理的這篇文章主要介紹了
android 图片轮播
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天,簡單講講Android圖片輪播功能。
其實圖片輪播功能就是使用ViewPager和Handler,網上查找了資料,把這個簡單的問題寫的很復雜。其實一個自定義控件完全可以解決。這里直接上代碼,不在做過多的講解了。有問題的可以提問,我看到后會盡量回復。
一.定義相關變量
private final int DELAY_TIME = 3000;//自動輪播時間 private List<String> mUrls; private List<ImageView> mViewpagerViews; //輪播圖片的列表 private List<ImageView> mDotImageviews; //輪播圓點的列表 private Context context; private int size;//圓點的大小 private int margin;//圓點的間距 private int count;//viewpager中view的數量 private ViewPager mViewPager; private LinearLayout mDotlayout;//圓點布局 private MyPager mPagerAdapter;private int currentItem;//當前viewpager索引 private Handler handler = new Handler(); private BannerClicklistener mBannerClicklistener;2.初始化代碼
private void init(Context context, AttributeSet attrs) {this.context = context;mUrls = new ArrayList<>();mViewpagerViews = new ArrayList<>();mDotImageviews = new ArrayList<>();//拿到自定義的屬性數組TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Banner);//得到數組里的自定義的size(圓點大小)size = typedArray.getDimensionPixelSize(R.styleable.Banner_size, 10);//得到數組里的自定義的margin(圓點間距)margin = typedArray.getDimensionPixelSize(R.styleable.Banner_margin, 10);typedArray.recycle();//通知jvm的垃圾回收器,當你回收對象的時候,一定要把我回收了View view = LayoutInflater.from(context).inflate(R.layout.banner_layout, this, true); // addView(view); // View child = LayoutInflater.from(context).inflate(R.layout.banner_layout,null); // addView(child);mViewPager = (ViewPager) view.findViewById(R.id.viewpager);mDotlayout = (LinearLayout) view.findViewById(R.id.layout_dot);//添加viewpager頁面改變監聽mViewPager.addOnPageChangeListener(this);}3.繪制圖片
private void drawViewpager() {for (int i = 0; i < count; i++) {ImageView iv = new ImageView(context);iv.setScaleType(ImageView.ScaleType.CENTER_CROP);mViewpagerViews.add(iv);}if (mViewpagerViews != null) {mPagerAdapter = new MyPager();mViewPager.setAdapter(mPagerAdapter);}}圖片的adapter:
class MyPager extends PagerAdapter {@Overridepublic int getCount() {return mViewpagerViews.size();}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}@Overridepublic Object instantiateItem(ViewGroup container, final int position) {ImageView view = mViewpagerViews.get(position);container.addView(view);view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {//實現點擊邏輯mBannerClicklistener.onClickListener(position);}});// System.out.println("urls:"+mUrls.get(position));ImageLoader.getInstance().displayImage(mUrls.get(position), view); // Glide.with(context) // .load(mUrls.get(position)) // .into(view);return view;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}}4.繪制圓點
/*** 繪制圓點*/private void drawDots() {for (int i = 0; i < count; i++) {ImageView iv = new ImageView(context);LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(size, size);params.leftMargin = margin;params.rightMargin = margin;iv.setLayoutParams(params);mDotImageviews.add(iv);if (i == 0) {iv.setImageResource(R.drawable.dot_selected);} else {iv.setImageResource(R.drawable.dot_normal);}mDotlayout.addView(iv);}}5.設置自動滾動
/*** 設置自動滾動*/private void setAuto() {handler.postDelayed(mTask, DELAY_TIME);}這個其實就是使用handle循環發送消息,進行圖片輪播。mTask代碼:
/*** 定時任務*/Runnable mTask = new Runnable() {@Overridepublic void run() {currentItem++;if (currentItem >= count) {currentItem = 0;}mViewPager.setCurrentItem(currentItem);handler.postDelayed(this, DELAY_TIME);}};6.監聽滑動事件,當用戶滑動時,停止自動輪播
/*** 處理自動輪播和手動滑動的沖突** @param ev* @return*/@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {int action = ev.getAction();if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) {stopAuto();} else if (action == MotionEvent.ACTION_UP) {setAuto();}return super.dispatchTouchEvent(ev);} /*** 取消自動輪播任務*/private void stopAuto() {handler.removeCallbacks(mTask);//取消任務}簡單講講,其實就是自定義控件,里面有圖片的adapter,和圓點的列表,設置一個handler不停的發送命令,實現了圖片自動輪播,監聽滑動點擊事件,處理用戶手動滑動與自動滑動的沖突。
?
自定義控件的xml文件:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="match_parent"android:layout_height="200dp" /><LinearLayoutandroid:id="@+id/layout_dot"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:gravity="center"android:orientation="horizontal"android:paddingBottom="10dp" /></FrameLayout>使用也很簡單:
banner = (Banner) findViewById(R.id.banner);urls = new ArrayList<>();urls.add("http://img2.imgtn.bdimg.com/it/u=3585804305,763553611&fm=27&gp=0.jpg");urls.add("http://img0.imgtn.bdimg.com/it/u=3281146250,5393266&fm=27&gp=0.jpg");urls.add("http://img5.imgtn.bdimg.com/it/u=2496610138,254842195&fm=27&gp=0.jpg");urls.add("http://img5.imgtn.bdimg.com/it/u=2951375427,1212049814&fm=27&gp=0.jpg");//解耦banner.loadData(urls).display();//構建者模式返回對象本身banner.setBannerClicklistener(new Banner.BannerClicklistener() {@Overridepublic void onClickListener(int pos) {Toast.makeText(MainActivity.this, "pos====" + pos, Toast.LENGTH_SHORT).show();}});如果有一定基礎,應該能看懂了。如果看不懂,可以下載源碼:https://download.csdn.net/download/bzlj2912009596/10588473
?
android 圖片輪播就講完了。
?
就這么簡單。
總結
以上是生活随笔為你收集整理的android 图片轮播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android jdk环境的配置
- 下一篇: android 圆角图片