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 {
/** 觸摸時按下的點 **/
PointF downP = new PointF();
/** 觸摸時當前的點 **/
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) {
//每次進行onTouch事件都記錄當前的按下的坐標
if(getChildCount()<=1)
{
return super.onTouchEvent(arg0);
}
curP.x = arg0.getX();
curP.y = arg0.getY();
if(arg0.getAction() == MotionEvent.ACTION_DOWN)
{
//記錄按下時候的坐標
//切記不可用 downP = curP ,這樣在改變curP的時候,downP也會改變
downP.x = arg0.getX();
downP.y = arg0.getY();
//此句代碼是為了通知他的父ViewPager現(xiàn)在進行的是本控件的操作,不要對我的操作進行干擾
getParent().requestDisallowInterceptTouchEvent(true);
}
if(arg0.getAction() == MotionEvent.ACTION_MOVE){
//此句代碼是為了通知他的父ViewPager現(xiàn)在進行的是本控件的操作,不要對我的操作進行干擾
getParent().requestDisallowInterceptTouchEvent(true);
}
if(arg0.getAction() == MotionEvent.ACTION_UP || arg0.getAction() == MotionEvent.ACTION_CANCEL){
//在up時判斷是否按下和松手的坐標為一個點
//如果是一個點,將執(zhí)行點擊事件,這是我自己寫的點擊事件,而不是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小技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
Android Studio中配置OpenCV庫開發(fā)環(huán)境的教程
這篇文章主要介紹了Android Studio中配置OpenCV庫開發(fā)環(huán)境的教程,OpenCV有Java接口,因而也經(jīng)常被用來做安卓開發(fā),需要的朋友可以參考下2016-05-05
Android開發(fā)之利用Intent實現(xiàn)數(shù)據(jù)傳遞的方法
這篇文章主要介紹了Android開發(fā)之利用Intent實現(xiàn)數(shù)據(jù)傳遞的方法,實例分析了Intent傳遞數(shù)據(jù)的原理與相關(guān)使用技巧,需要的朋友可以參考下2016-03-03
Android9.0 SystemUI 網(wǎng)絡(luò)信號欄定制修改的流程解析
這篇文章主要介紹了Android9.0 SystemUI 網(wǎng)絡(luò)信號欄定制修改的流程,本文通過圖文實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11
android通過okhttpClient下載網(wǎng)頁內(nèi)容的實例代碼
本篇文章主要介紹了android通過okhttpClient下載網(wǎng)頁內(nèi)容的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
Android中判斷手機是否聯(lián)網(wǎng)實例
這篇文章主要介紹了Android中判斷手機是否聯(lián)網(wǎng)實例,包括xml配置文件及功能代碼的實現(xiàn),需要的朋友可以參考下2014-10-10

