Android自定義Banner輪播效果
本文實(shí)例為大家分享了Android自定義Banner輪播效果展示的具體代碼,供大家參考,具體內(nèi)容如下
自定義View布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v4.view.ViewPager android:id="@+id/banner_view_pager" android:layout_width="match_parent" android:layout_height="200dp"> </android.support.v4.view.ViewPager> <LinearLayout android:id="@+id/linear_bannner" android:layout_centerHorizontal="true" android:layout_alignBottom="@+id/banner_view_pager" android:layout_marginBottom="10dp" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> </LinearLayout> </RelativeLayout>
自定義View主體內(nèi)容
public class CustomBanner extends FrameLayout { @BindView(R.id.banner_view_pager) ViewPager bannerViewPager; @BindView(R.id.linear_bannner) LinearLayout linearBannner; private List<String> list; private int time = 2; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0) { int currentItem = bannerViewPager.getCurrentItem(); bannerViewPager.setCurrentItem(currentItem + 1); //再次發(fā)送 sendEmptyMessageDelayed(0, time * 1000); } } }; private List<ImageView> listDoc; private OnClickLisner onClickLisner; public CustomBanner(@NonNull Context context) { super(context); init(); } public CustomBanner(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public CustomBanner(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } /** * 初始化 */ private void init() { View view = View.inflate(getContext(), R.layout.bannner_layout, this); ButterKnife.bind(this, view); } /** * 對(duì)外提供設(shè)置image路徑的方法 */ public void setImageUrls(List<String> list) { this.list = list; if (list == null) { return; } //設(shè)置適配器 LunBoAdapter lunBoAdapter = new LunBoAdapter(getContext(), list); bannerViewPager.setAdapter(lunBoAdapter); initDoc(); //顯示中間某個(gè)位置 bannerViewPager.setCurrentItem(list.size() * 10000); //使用handler自動(dòng)輪播 handler.sendEmptyMessageDelayed(0, time * 1000); //狀態(tài)改變的監(jiān)聽事件 bannerViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //在選中某一頁的時(shí)候,切換小圓點(diǎn)的背景 for (int i = 0; i < listDoc.size(); i++) { if (position % listDoc.size() == i) { listDoc.get(i).setBackgroundResource(R.drawable.shape_01); } else { listDoc.get(i).setBackgroundResource(R.drawable.shape_02); } } } @Override public void onPageScrollStateChanged(int state) { } }); } /** * 初始化小圓點(diǎn) */ private void initDoc() { //創(chuàng)建一個(gè)集合,記錄這些小圓點(diǎn) listDoc = new ArrayList<>(); //清空布局 linearBannner.removeAllViews(); for (int i = 0; i < list.size(); i++) { ImageView docImage = new ImageView(getContext()); if (i == 0) { docImage.setBackgroundResource(R.drawable.shape_01); } else { docImage.setBackgroundResource(R.drawable.shape_02); } //添加到集合 listDoc.add(docImage); //添加到線性布局 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(5, 0, 5, 0); linearBannner.addView(docImage, params); } } /** * 對(duì)外提供輪播的時(shí)間 */ public void setTimeSecond(int time) { this.time = time; } /** * 點(diǎn)擊事件 * * @param onClickLisner */ public void setClickListner(OnClickLisner onClickLisner) { this.onClickLisner = onClickLisner; } private class LunBoAdapter extends PagerAdapter { private List<String> list; private Context context; public LunBoAdapter(Context context, List<String> list) { this.context = context; this.list = list; } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, final int position) { //創(chuàng)建imageView ImageView imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.FIT_XY); //加載這張圖片 Glide.with(context).load(list.get(position % list.size())).into(imageView); //點(diǎn)擊事件 imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { //觸發(fā) onClickLisner.onItemClick(position % list.size()); } }); //觸摸事件 imageView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: //取消handler身上的消息和回調(diào) handler.removeCallbacksAndMessages(null); break; case MotionEvent.ACTION_MOVE: handler.removeCallbacksAndMessages(null); break; case MotionEvent.ACTION_CANCEL: handler.sendEmptyMessageDelayed(0, time * 1000); break; case MotionEvent.ACTION_UP: handler.sendEmptyMessageDelayed(0, time * 1000); break; } return false; } }); //添加到容器 container.addView(imageView); //返回 return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } public interface OnClickLisner { void onItemClick(int position); } }
自定義小圓點(diǎn)
public class CountView extends View implements View.OnClickListener { private int count = 0; public CountView(Context context) { super(context); init(); } public CountView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public CountView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } //初始化的方法 private void init() { this.setOnClickListener(this); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(Color.RED); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); //圓 canvas.drawCircle(300,300,200,paint); paint.setColor(Color.BLACK); paint.setTextSize(100); String text = String.valueOf(count); //拿到文本的寬度和高度 Rect rect = new Rect(); paint.getTextBounds(text,0,text.length(),rect); canvas.drawText(text,300-rect.width()/2,300+rect.height()/2,paint); } @Override public void onClick(View view) { count ++; //重新繪制 postInvalidate(); } }
小圓點(diǎn)shape
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#00ff00"/> <corners android:radius="10dp"/> <size android:height="10dp" android:width="10dp"/> </shape> <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#ff0000"/> <corners android:radius="10dp"/> <size android:height="10dp" android:width="10dp"/> </shape>
在Main中運(yùn)行
public class MainActivity extends AppCompatActivity { private CustomBanner customBanner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); customBanner = findViewById(R.id.custom_banner); getDataFromNet(); } private void getDataFromNet() { OkHttpUtil.doGet("https://www.zhaoapi.cn/ad/getAd", new Callback() { private List<String> list; @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()){ String json = response.body().string(); final HomeBean detalBean = new Gson().fromJson(json,HomeBean.class); list = new ArrayList<>(); List<HomeBean.DataBean> data = detalBean.getData(); for (int i = 0; i < data.size(); i++) { String icon = data.get(i).getIcon(); list.add(icon); } runOnUiThread(new Runnable() { @Override public void run() { //設(shè)置時(shí)間 customBanner.setTimeSecond(5); //設(shè)置顯示輪播 customBanner.setImageUrls(list); //banner的點(diǎn)擊跳轉(zhuǎn)詳情頁面的事件 banner.setOnBannerListener(new OnBannerListener() { @Override public void OnBannerClick(int position) { List<ShouBean.DataBean> datab = shouBean.getData(); if (datab.get(position).getType() == 0) { Intent intent = new Intent(getActivity(), WebViewActivity.class); intent.putExtra("databurl", datab.get(position).getUrl()); startActivity(intent); } else { Toast.makeText(getContext(), "即將跳轉(zhuǎn)到商品詳情頁面", Toast.LENGTH_SHORT).show(); } } }); } }); } } }); } }
WebView頁面
public class WebViewActivity extends AppCompatActivity { private WebView web_view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); web_view = findViewById(R.id.web_view); String databurl = getIntent().getStringExtra("databurl"); web_view.loadUrl(databurl); //webview一系列設(shè)置 web_view.setWebViewClient(new WebViewClient());//在當(dāng)前應(yīng)用打開,而不是去瀏覽器 WebSettings settings = web_view.getSettings(); settings.setJavaScriptEnabled(true); settings.setJavaScriptCanOpenWindowsAutomatically(true); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
flutter 輪播圖動(dòng)態(tài)加載網(wǎng)絡(luò)圖片的方法
Flutter是谷歌的移動(dòng)UI框架,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面。這篇文章主要介紹了flutter 輪播圖動(dòng)態(tài)加載網(wǎng)絡(luò)圖片的方法 ,需要的朋友可以參考下2019-07-07android 自定義TabActivity的實(shí)例方法
系統(tǒng)自帶的TabActivity的效果不甚理想。開發(fā)中對(duì)TabActivity自定義可能有兩種:第一種:改變TAB行的位置,如放到頁面下方。第二種:對(duì)TabHost圖片的自定義2013-11-11android view實(shí)現(xiàn)一張圖片的漸隱效果
這篇文章主要為大家詳細(xì)介紹了android view實(shí)現(xiàn)一張圖片的漸隱效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android 本地廣播和強(qiáng)制下線功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 本地廣播和強(qiáng)制下線功能的實(shí)現(xiàn)代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Android利用Canvas標(biāo)點(diǎn)畫線并加入位移動(dòng)畫(1)
這篇文章主要為大家詳細(xì)介紹了Android利用Canvas標(biāo)點(diǎn)畫線并加入位移動(dòng)畫的第一篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09