android輪播圖組件的制作方法
本文實例為大家分享了android輪播圖組件的制作方法,供大家參考,具體內(nèi)容如下
BannerLayout
package com.coral3.common_module.components; import android.content.Context; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; import com.coral3.common_module.R; import com.coral3.common_module.utils.LogUtil; import com.coral3.common_module.viewPager.ChildViewPager; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class BannerLayout extends LinearLayout { private Context mContext; private View view; private ChildViewPager viewPager; private ImageView indicator; private ImageView[] indicators; private Boolean isContinue = true; private ViewGroup group; private AtomicInteger index = new AtomicInteger(); private Handler handler = new Handler(new Handler.Callback(){ @Override public boolean handleMessage(Message message) { viewPager.setCurrentItem(message.what); return false; } }); public BannerLayout(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mContext = context; initView(); initListener(); } private void initView(){ view = LayoutInflater.from(mContext).inflate(R.layout.layout_banner, this); group = view.findViewById(R.id.view_indicators); viewPager = view.findViewById(R.id.view_banners); // 動態(tài)加入圖片 List<View> listPics = new ArrayList<>(); ImageView img1 = new ImageView(mContext); img1.setBackgroundResource(R.drawable.banner1); listPics.add(img1); ImageView img2 = new ImageView(mContext); img2.setBackgroundResource(R.drawable.banner2); listPics.add(img2); ImageView img3 = new ImageView(mContext); img3.setBackgroundResource(R.drawable.banner3); listPics.add(img3); ImageView img4 = new ImageView(mContext); img4.setBackgroundResource(R.drawable.banner4); listPics.add(img4); ImageView img5 = new ImageView(mContext); img5.setBackgroundResource(R.drawable.banner4); listPics.add(0, img5); ImageView img0 = new ImageView(mContext); img0.setBackgroundResource(R.drawable.banner1); listPics.add(img0); //動態(tài)加入指示器 indicators = new ImageView[listPics.size()]; for(int i = 0; i < indicators.length; i++){ indicator = new ImageView(mContext); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(15, 15); layoutParams.setMargins(0, 0, 10, 0); indicator.setLayoutParams(layoutParams); indicators[i] = indicator; if(i == 1){ indicators[i].setBackgroundResource(R.drawable.shape_banner_checked); }else{ indicators[i].setBackgroundResource(R.drawable.shape_banner_unchecked); } if(i == 0 || i == 5){ indicators[i].setVisibility(View.INVISIBLE); } group.addView(indicators[i]); } viewPager.setAdapter(new MyPagerAdapter(listPics)); index.incrementAndGet(); // 輪播 new Thread(new Runnable() { @Override public void run() { while (true){ if(isContinue){ handler.sendEmptyMessage(index.get()); whatOption(); } } } }).start(); } private void initListener(){ // 設(shè)置監(jiān)聽器 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { LogUtil.d(positionOffset + "-" + positionOffsetPixels); // 無縫滾動均滑 // if(positionOffset == 0.0){ // LogUtil.d(position + ""); // if(position == 5) { // viewPager.setCurrentItem(1, false); // } // if(position == 0) { // viewPager.setCurrentItem(4, false); // } // } } @Override public void onPageSelected(int position) { index.getAndSet(position); if(position == 5) { viewPager.setCurrentItem(1, false); } if(position == 0) { viewPager.setCurrentItem(4, false); } for(int i = 0; i < indicators.length; i++){ if(i == index.get()){ indicators[i].setBackgroundResource(R.drawable.shape_banner_checked); }else{ indicators[i].setBackgroundResource(R.drawable.shape_banner_unchecked); } } if(position == 0) indicators[4].setBackgroundResource(R.drawable.shape_banner_checked); if(position == 5) indicators[1].setBackgroundResource(R.drawable.shape_banner_checked); } @Override public void onPageScrollStateChanged(int state) {} }); // 設(shè)置觸摸時停止定時 viewPager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()){ case MotionEvent.ACTION_DOWN: isContinue = false; break; case MotionEvent.ACTION_UP: isContinue = true; break; } return false; } }); } class MyPagerAdapter extends PagerAdapter { private List<View> listView; @Override public int getCount() { return listView.size(); } public MyPagerAdapter(List<View> listView){ this.listView = listView; } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { container.addView(listView.get(position)); return listView.get(position); } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView(listView.get(position)); } } private void whatOption(){ index.incrementAndGet(); if(index.get() > indicators.length - 2){ index.getAndAdd(-4); } try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } }
layout_banner
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <com.coral3.common_module.viewPager.ChildViewPager android:id="@+id/view_banners" android:layout_width="match_parent" android:layout_height="200dp"/> <LinearLayout android:id="@+id/view_indicators" android:layout_below="@+id/view_banners" android:gravity="center" android:layout_marginTop="-15dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" /> </RelativeLayout> </LinearLayout>
ChildViewPager
package com.coral3.common_module.viewPager; import android.content.Context; import android.graphics.PointF; import android.util.AttributeSet; import android.view.MotionEvent; import androidx.viewpager.widget.ViewPager; public class ChildViewPager extends ViewPager { /** 觸摸時按下的點(diǎn) **/ PointF downP = new PointF(); /** 觸摸時當(dāng)前的點(diǎn) **/ PointF curP = new PointF(); public ChildViewPager(Context context) { super(context); } public ChildViewPager(Context context, AttributeSet attrs) { super(context, attrs); } private static final String TAG = "ChildViewpager"; @Override public boolean onTouchEvent(MotionEvent arg0) { //每次進(jìn)行onTouch事件都記錄當(dāng)前的按下的坐標(biāo) if(getChildCount()<=1) { return super.onTouchEvent(arg0); } curP.x = arg0.getX(); curP.y = arg0.getY(); if(arg0.getAction() == MotionEvent.ACTION_DOWN) { //記錄按下時候的坐標(biāo) //切記不可用 downP = curP ,這樣在改變curP的時候,downP也會改變 downP.x = arg0.getX(); downP.y = arg0.getY(); //此句代碼是為了通知他的父ViewPager現(xiàn)在進(jìn)行的是本控件的操作,不要對我的操作進(jìn)行干擾 getParent().requestDisallowInterceptTouchEvent(true); } if(arg0.getAction() == MotionEvent.ACTION_MOVE){ //此句代碼是為了通知他的父ViewPager現(xiàn)在進(jìn)行的是本控件的操作,不要對我的操作進(jìn)行干擾 getParent().requestDisallowInterceptTouchEvent(true); } if(arg0.getAction() == MotionEvent.ACTION_UP || arg0.getAction() == MotionEvent.ACTION_CANCEL){ //在up時判斷是否按下和松手的坐標(biāo)為一個點(diǎn) //如果是一個點(diǎn),將執(zhí)行點(diǎn)擊事件,這是我自己寫的點(diǎn)擊事件,而不是onclick getParent().requestDisallowInterceptTouchEvent(false); if(downP.x==curP.x && downP.y==curP.y){ return true; } } super.onTouchEvent(arg0); //注意這句不能 return super.onTouchEvent(arg0); 否則觸發(fā)parent滑動 return true; } }
使用
<com.coral3.common_module.components.BannerLayout android:id="@+id/home_banner" android:layout_width="match_parent" android:layout_height="wrap_content"/>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實現(xiàn)炫酷輪播圖效果
- Android實現(xiàn)輪播圖片展示效果
- Android實現(xiàn)ViewPage輪播圖效果
- Android使用viewpager實現(xiàn)自動無限輪播圖
- Android ViewPager實現(xiàn)輪播圖效果
- Android開發(fā)實現(xiàn)的自動換圖片、輪播圖效果示例
- Android自定義控件實現(xiàn)優(yōu)雅的廣告輪播圖
- Android自定義控件實現(xiàn)簡單的輪播圖控件
- Android實現(xiàn)基于ViewPager的無限循環(huán)自動播放帶指示器的輪播圖CarouselFigureView控件
- Android如何使用RecyclerView打造首頁輪播圖
相關(guān)文章
Flutter Recovering Stream Errors小技巧
這篇文章主要為大家介紹了Flutter Recovering Stream Errors小技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android Studio中配置OpenCV庫開發(fā)環(huán)境的教程
這篇文章主要介紹了Android Studio中配置OpenCV庫開發(fā)環(huán)境的教程,OpenCV有Java接口,因而也經(jīng)常被用來做安卓開發(fā),需要的朋友可以參考下2016-05-05Android開發(fā)之利用Intent實現(xiàn)數(shù)據(jù)傳遞的方法
這篇文章主要介紹了Android開發(fā)之利用Intent實現(xiàn)數(shù)據(jù)傳遞的方法,實例分析了Intent傳遞數(shù)據(jù)的原理與相關(guān)使用技巧,需要的朋友可以參考下2016-03-03Android9.0 SystemUI 網(wǎng)絡(luò)信號欄定制修改的流程解析
這篇文章主要介紹了Android9.0 SystemUI 網(wǎng)絡(luò)信號欄定制修改的流程,本文通過圖文實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11android通過okhttpClient下載網(wǎng)頁內(nèi)容的實例代碼
本篇文章主要介紹了android通過okhttpClient下載網(wǎng)頁內(nèi)容的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08Android中判斷手機(jī)是否聯(lián)網(wǎng)實例
這篇文章主要介紹了Android中判斷手機(jī)是否聯(lián)網(wǎng)實例,包括xml配置文件及功能代碼的實現(xiàn),需要的朋友可以參考下2014-10-10