安卓轮播图的实现(自定义view)

/*******************************************************
 * @author: wukai             *         * * * *
 * @date: 2017/10/12         *         *     *
 * @description:                *         * * * *
 * @version 1.0
 * 主界面设置* * * *   *
 *******************************************************/
public class MainActivity extends AppCompatActivity {

    VerticalText mVerticalText;
    ArrayList<String> mList;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dai_main);
     

    }}
=============================xml设置===========================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="160dp">

        <com.slideshow.com.comslideshowcom.SlidSowView
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
</LinearLayout>
==========================================自定义view============================
package com.slideshow.com.comslideshowcom;


import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.AttrRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


/*******************************************************
 * @author: wukai             *         * * * *
 * @date: 2017/10/12         *         *     *
 * @description:                *         * * * *
 * @version 1.0
 * 自定义轮播图* * * *   *
 *******************************************************/
public class SlidSowView extends FrameLayout {
    //自动轮播启用开关
    public static final boolean isAutoPlay = true;
    private Context mContext;
    ArrayList<String> mList;
    ArrayList<ImageView> mImageViews;
    ArrayList<View> mViews;
    //当前轮播页
    private int currentItem = 0;
    //定时任务
    private ScheduledExecutorService mScheduledExecutorService;
    ViewPager mViewPager;
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            mViewPager.setCurrentItem(currentItem);
        }
    };

    public SlidSowView(@NonNull Context context) {
        this(context, null);
    }

    public SlidSowView(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SlidSowView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        //初始化数据
        initData();
    }

    private void initData() {

        mImageViews = new ArrayList<>();
        mViews = new ArrayList<>();
        //初始化布局
        initUI(mContext);
        //初始化定时任务的方法
        initTimer();
    }

    private void initTimer() {
        mScheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        mScheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 1, 5, TimeUnit.SECONDS);
        /*new SlideShowTask()是一个实现Runnable接口的类,会自动运行里面的run()方法,1的意思就是启动等待时间,这里就是直接运行,
        5是5秒,要是想小时,就把TimeUnit.SECONDS TimeUnit.HOURS,分钟是TimeUnit.MINUTES*/
    }

    //执行轮播图切换任务
    private class SlideShowTask implements Runnable {
        @Override
        public void run() {
            currentItem = (currentItem + 1) % mImageViews.size();
            mHandler.obtainMessage().sendToTarget();
        }
    }

    private void initUI(Context context) {
        LayoutInflater.from(context).inflate(R.layout.slidsow, this, true);
        LinearLayout douLayout = (LinearLayout) findViewById(R.id.linearlatouy_slidsow);
        douLayout.removeAllViews();
        //显示图片
        ImageView view1 = new ImageView(mContext);
        view1.setBackgroundResource(R.drawable.a);
        ImageView view2 = new ImageView(mContext);
        view2.setBackgroundResource(R.drawable.b);
        ImageView view3 = new ImageView(mContext);
        view3.setBackgroundResource(R.drawable.c);
        ImageView view4 = new ImageView(mContext);
        view4.setBackgroundResource(R.drawable.d);
        mImageViews.add(view1);
        mImageViews.add(view2);
        mImageViews.add(view3);
        mImageViews.add(view4);
        //小点
        for (int i = 0; i < mImageViews.size(); i++) {
            //初始化轮播图的点击监听事件
            mImageViews.get(i).setId(i);
            mImageViews.get(i).setOnClickListener(new MyListener());
            View pointView = new View(mContext);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10);
            //初始化圆点以及颜色
            if (i == 0) {
                pointView.setBackgroundResource(R.color.colorAccent);
            } else {
                pointView.setBackgroundResource(R.color.colorPrimary);
            }
            params.leftMargin = 10;
            pointView.setLayoutParams(params);
            mViews.add(pointView);
            //将小点添加到布局中去
            douLayout.addView(pointView, params);
        }
        mViewPager = (ViewPager) findViewById(R.id.viewpager_slidsow);
        //启动适配器
        MyPagerAdaapter adaapter = new MyPagerAdaapter();
        mViewPager.setFocusable(true);
        mViewPager.setAdapter(adaapter);
        //初始化轮播图的滑动监听事件
        mViewPager.setOnPageChangeListener(new MyPageChangeListener());
        //设置初始化需要显示的条目数
        mViewPager.setCurrentItem(0);
    }

    //自定义轮播图点击事件
    class MyListener implements OnClickListener {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case 0:
                    Toast.makeText(mContext, "点击的是第一张轮播图!", Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    Toast.makeText(mContext, "点击的是第二张轮播图!", Toast.LENGTH_SHORT).show();
                    break;
                case 2:
                    Toast.makeText(mContext, "点击的是第三张轮播图!", Toast.LENGTH_SHORT).show();
                    break;
                case 3:
                    Toast.makeText(mContext, "点击的是第四张轮播图!", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }

    //自定义PageChangeListener
    class MyPageChangeListener implements ViewPager.OnPageChangeListener {
        //滑动被调用
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {


        }

        //滑动状态被选定
        @Override
        public void onPageSelected(int position) {
            currentItem = position;
            for (int i = 0; i < mViews.size(); i++) {
                if (i == position) {
                    mViews.get(i).setBackgroundResource(R.color.colorAccent);
                } else {
                    mViews.get(i).setBackgroundResource(R.color.colorPrimary);
                }

            }
        }

        //滑动状态改变时
        @Override
        public void onPageScrollStateChanged(int state) {
        }
    }

    //自定义PagerAdapter
    class MyPagerAdaapter extends PagerAdapter {
        //返回轮播图的最大显示条目数
        @Override
        public int getCount() {
            return mImageViews.size();
        }

        //判断View是否可复用
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        //返回要显示的条目,并创建条目
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            int newPosition = position % mImageViews.size();
            ImageView imageView = mImageViews.get(newPosition);
            container.addView(imageView);
            return imageView;
        }

        //销毁看不到的条目
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(mImageViews.get(position));
        }
    }
}
=======================================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"
                android:orientation="vertical">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager_slidsow"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <LinearLayout
        android:id="@+id/linearlatouy_slidsow"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="8dp">

    </LinearLayout>
</RelativeLayout>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 轮播图可以通过 ViewPager 和自定义 View 实现。下面是使用 ViewPager 实现轮播图的示例代码: 1. 在布局文件中添加 ViewPager 和指示器(可以使用自定义的指示器): ```xml <androidx.viewpager.widget.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="200dp"/> <LinearLayout android:id="@+id/indicator_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal"/> ``` 2. 在 Java 代码中设置 ViewPager 的 Adapter 和指示器: ```java // 设置轮播图的图片资源和标题 int[] imageIds = {R.drawable.image1, R.drawable.image2, R.drawable.image3}; String[] titles = {"Image 1", "Image 2", "Image 3"}; // 设置 ViewPager 的 Adapter ViewPager viewPager = findViewById(R.id.view_pager); viewPager.setAdapter(new BannerAdapter(imageIds, titles)); // 设置指示器 LinearLayout indicatorLayout = findViewById(R.id.indicator_layout); for (int i = 0; i < imageIds.length; i++) { ImageView indicator = new ImageView(this); indicator.setImageResource(R.drawable.indicator_selector); indicator.setSelected(i == 0); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(10, 0, 10, 0); indicatorLayout.addView(indicator, params); } viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { for (int i = 0; i < indicatorLayout.getChildCount(); i++) { indicatorLayout.getChildAt(i).setSelected(i == position); } } @Override public void onPageScrollStateChanged(int state) {} }); ``` 3. 编写 ViewPager 的 Adapter: ```java public class BannerAdapter extends PagerAdapter { private int[] mImageIds; private String[] mTitles; public BannerAdapter(int[] imageIds, String[] titles) { mImageIds = imageIds; mTitles = titles; } @Override public int getCount() { return mImageIds.length; } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { ImageView imageView = new ImageView(container.getContext()); imageView.setImageResource(mImageIds[position]); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); container.addView(imageView); return imageView; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); } @Nullable @Override public CharSequence getPageTitle(int position) { return mTitles[position]; } } ``` 上述代码中,BannerAdapter 继承自 PagerAdapter,实现了 getCount、isViewFromObject、instantiateItem、destroyItem、getPageTitle 等方法,其中 instantiateItem 方法返回的是轮播图的每一页的 ViewViewPager 的 addOnPageChangeListener 方法用于监听 ViewPager 的滑动事件,实现了 onPageScrolled、onPageSelected、onPageScrollStateChanged 三个方法。指示器的实现可以使用 LinearLayout 和 ImageView,也可以使用自定义View
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值