Android使用自定义控件实现加载本地图片无限轮播

来源:互联网 发布:淘宝做什么类目比较好 编辑:程序博客网 时间:2024/06/16 18:11

实现效果如下:


不说那么多,直接上代码:

MainActivity

import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.ImageView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ImageCycleView mImageCycleView = (ImageCycleView) findViewById(R.id.icv_topView);//mImageCycleView.setAutoCycle(false); //关闭自动播放//mImageCycleView.setCycleDelayed(2000);//设置自动轮播循环时间////mImageCycleView.setIndicationStyle(ImageCycleView.IndicationStyle.COLOR,//Color.BLUE, Color.RED, 1f);//mImageCycleView.setIndicationStyle(ImageCycleView.IndicationStyle.IMAGE,//R.drawable.dian_unfocus, R.drawable.dian_focus, 1f);//Log.e("eee", Environment.getExternalStorageDirectory().getPath()+ File.separator+"a1.jpg");        List<ImageCycleView.ImageInfo> list=new ArrayList<ImageCycleView.ImageInfo>();        //res图片资源        list.add(new ImageCycleView.ImageInfo(R.drawable.a1,"111111111111",""));        list.add(new ImageCycleView.ImageInfo(R.drawable.a2,"222222222222222",""));        list.add(new ImageCycleView.ImageInfo(R.drawable.a3,"3333333333333",""));        //SD卡图片资源//list.add(new ImageCycleView.ImageInfo(new File(Environment.getExternalStorageDirectory(),"a1.jpg"),"11111",""));//list.add(new ImageCycleView.ImageInfo(new File(Environment.getExternalStorageDirectory(),"a2.jpg"),"22222",""));//list.add(new ImageCycleView.ImageInfo(new File(Environment.getExternalStorageDirectory(),"a3.jpg"),"33333",""));        //使用网络加载图片//list.add(new ImageCycleView.ImageInfo("http://img.lakalaec.com/ad/57ab6dc2-43f2-4087-81e2-b5ab5681642d.jpg","11","eeee"));//list.add(new ImageCycleView.ImageInfo("http://img.lakalaec.com/ad/cb56a1a6-6c33-41e4-9c3c-363f4ec6b728.jpg","222","rrrr"));//list.add(new ImageCycleView.ImageInfo("http://img.lakalaec.com/ad/e4229e25-3906-4049-9fe8-e2b52a98f6d1.jpg", "333", "tttt"));        mImageCycleView.setOnPageClickListener(new ImageCycleView.OnPageClickListener() {            @Override            public void onClick(View imageView, ImageCycleView.ImageInfo imageInfo) {                Toast.makeText(MainActivity.this, "你点击了" + imageInfo.value.toString(), Toast.LENGTH_SHORT).show();            }        });        mImageCycleView.loadData(list, new ImageCycleView.LoadImageCallBack() {            @Override            public ImageView loadAndDisplay(ImageCycleView.ImageInfo imageInfo) {                //本地图片                ImageView imageView=new ImageView(MainActivity.this);                imageView.setImageResource(Integer.parseInt(imageInfo.image.toString()));                return imageView;////使用SD卡图片//SmartImageView smartImageView=new SmartImageView(MainActivity.this);//smartImageView.setImageURI(Uri.fromFile((File)imageInfo.image));//return smartImageView;////使用SmartImageView,既可以使用网络图片也可以使用本地资源//SmartImageView smartImageView=new SmartImageView(MainActivity.this);//smartImageView.setImageResource(Integer.parseInt(imageInfo.image.toString()));//return smartImageView;                //使用BitmapUtils,只能使用网络图片//BitmapUtils bitmapUtils = new BitmapUtils(MainActivity.this);//ImageView imageView = new ImageView(MainActivity.this);//bitmapUtils.display(imageView, imageInfo.image.toString());//return imageView;            }        });    }}


ImageCycleView

import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.text.TextUtils;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class ImageCycleView extends FrameLayout {    //上下文    private Context mContext;    //图片轮播视图    private ImageCycleViewPager mViewPager;    //数据集合    private List<ImageInfo> data = new ArrayList<ImageInfo>();    //加载图片回调函数    private LoadImageCallBack mLoadImageCallBack;    //图片轮播指示器    private LinearLayout mIndicationGroup;    //轮播的总数    private int mCount = 0;    //未获得焦点    private Bitmap unFocusIndicationStyle;    //获得焦点    private Bitmap focusIndicationStyle;    //指示器间距,默认间距为指示器高度的1/2    private float indication_self_margin_percent = 0.5f;    //单击监听事件    private OnPageClickListener mOnPageClickListener;    //图片文本提示    private TextView mText;    public ImageCycleView(Context context) {        super(context);        init(context);    }    public ImageCycleView(Context context, AttributeSet attrs) {        super(context, attrs);        init(context);    }    //初始化基础信息    private void init(Context context) {        mContext = context;        unFocusIndicationStyle = drawCircle(50, Color.GRAY);        focusIndicationStyle = drawCircle(50, Color.WHITE);        initView();    }    //初始化View控件    private void initView() {        View.inflate(mContext, R.layout.view_image_cycle, this);        FrameLayout fl_image_cycle = (FrameLayout) findViewById(R.id.fl_image_cycle);        mViewPager = new ImageCycleViewPager(mContext);        mViewPager.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));        fl_image_cycle.addView(mViewPager);        mViewPager.setOnPageChangeListener(new ImageCyclePageChangeListener());        mIndicationGroup = (LinearLayout) findViewById(R.id.ll_indication_group);        mText = (TextView) findViewById(R.id.tv_text);    }    public enum IndicationStyle {        COLOR, IMAGE    }    //设置轮播指示器样式    public void setIndicationStyle(IndicationStyle indicationStyle, int unFocus, int focus, float indication_self_percent) {        if (indicationStyle == IndicationStyle.COLOR) {            unFocusIndicationStyle = drawCircle(50, unFocus);            focusIndicationStyle = drawCircle(50, focus);        } else if (indicationStyle == IndicationStyle.IMAGE) {            unFocusIndicationStyle = BitmapFactory.decodeResource(mContext.getResources(), unFocus);            focusIndicationStyle = BitmapFactory.decodeResource(mContext.getResources(), focus);        }        indication_self_margin_percent = indication_self_percent;        initIndication();    }    //图片轮播是自动滚动状态  true 自动滚动,false 图片不能自动滚动只能手动左右滑动    private boolean isAutoCycle = true;    //自动轮播间隔时间    private long mCycleDelayed = 3000;    //设置是否自动轮播    public void setCycleDelayed(long delayed) {        mCycleDelayed = delayed;    }    //设置是否自动无限轮播    public void setAutoCycle(Boolean state) {        isAutoCycle = state;    }    //加载显示的数据  网络图片资源及标题    public void loadData(List<ImageInfo> list, LoadImageCallBack callBack) {        data = list;        mCount = list.size();        initIndication();        if (callBack == null) {            new IllegalArgumentException("LoadImageCallBack 回调函数不能为空!");        }        mLoadImageCallBack = callBack;        mViewPager.setAdapter(new ImageCycleAdapter());        //最大值中间的第一个        mViewPager.setCurrentItem(Integer.MAX_VALUE / 2 - ((Integer.MAX_VALUE / 2) % mCount));    }    //设置点击事件监听回调函数    public void setOnPageClickListener(OnPageClickListener listener) {        mOnPageClickListener = listener;    }    //轮播控件的监听事件    public interface OnPageClickListener {        //单击图片事件        void onClick(View imageView, ImageInfo imageInfo);    }    //初始化指示器    private void initIndication() {        mIndicationGroup.removeAllViews();        for (int i = 0; i < mCount; i++) {            ImageView imageView = new ImageView(mContext);            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mIndicationGroup.getLayoutParams().height, LinearLayout.LayoutParams.MATCH_PARENT);            params.leftMargin = (int) (mIndicationGroup.getLayoutParams().height * indication_self_margin_percent);            imageView.setScaleType(ImageView.ScaleType.FIT_XY);            imageView.setLayoutParams(params);            if (i == 0) {                imageView.setImageBitmap(focusIndicationStyle);            } else {                imageView.setImageBitmap(unFocusIndicationStyle);            }            mIndicationGroup.addView(imageView);        }    }    private Bitmap drawCircle(int radius, int color) {        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);        paint.setColor(color);// 设置颜色        Bitmap bitmap = Bitmap.createBitmap(radius, radius, Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(bitmap);        canvas.drawCircle(radius / 2, radius / 2, radius / 2, paint);        return bitmap;    }    public static class ImageInfo {        public ImageInfo(Object image, String text, Object value) {            this.image = image;            this.text = text;            this.value = value;        }        public Object image;        public String text = "";        public Object value;    }    //加载图片并显示回调接口    public interface LoadImageCallBack {        ImageView loadAndDisplay(ImageInfo imageInfo);    }    //轮播图片监听    private final class ImageCyclePageChangeListener implements ViewPager.OnPageChangeListener {        //上次指示器指示的位置,开始为默认位置0        private int preIndex = 0;        @Override        public void onPageSelected(int index) {            index = index % mCount;            //更新文本信息            String text = data.get(index).text;            mText.setText(TextUtils.isEmpty(text) ? "" : text);            //恢复默认没有获得焦点指示器样式            ((ImageView) (mIndicationGroup.getChildAt(preIndex))).setImageBitmap(unFocusIndicationStyle);            // 设置当前显示图片的指示器样式            ((ImageView) (mIndicationGroup.getChildAt(index))).setImageBitmap(focusIndicationStyle);            preIndex = index;        }        @Override        public void onPageScrollStateChanged(int state) {        }        @Override        public void onPageScrolled(int i, float v, int i1) {        }    }    //图片轮播适配器    private class ImageCycleAdapter extends PagerAdapter {        @Override        public Object instantiateItem(ViewGroup container, final int position) {            final ImageInfo imageInfo = data.get(position % mCount);            ImageView imageView = mLoadImageCallBack.loadAndDisplay(imageInfo);            imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,                    ViewGroup.LayoutParams.MATCH_PARENT));            imageView.setScaleType(ImageView.ScaleType.FIT_XY);            // 设置图片点击监听            imageView.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View v) {                    if (mOnPageClickListener != null) {                        mOnPageClickListener.onClick(v, imageInfo);                    }                }            });            container.addView(imageView);            return imageView;        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            container.removeView((View) object);        }        @Override        public int getCount() {            return Integer.MAX_VALUE;        }        @Override        public boolean isViewFromObject(View view, Object obj) {            return view == obj;        }    }    //开始图片轮播    private void startImageCycle() {        handler.sendEmptyMessageDelayed(0, mCycleDelayed);    }    //暂停图片轮播    private void stopImageCycle() {        handler.removeCallbacksAndMessages(null);    }    //实现自动轮播    private Handler handler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            if (mViewPager != null) {                mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);                handler.sendEmptyMessageDelayed(0, mCycleDelayed);            }            return false;        }    });    //触摸停止计时器,抬起启动计时器    @Override    public boolean dispatchTouchEvent(MotionEvent event) {        if (event.getAction() == MotionEvent.ACTION_UP) {            if (isAutoCycle) {                // 开始图片滚动                startImageCycle();            }        } else {            if (isAutoCycle) {                // 停止图片滚动                stopImageCycle();            }        }        return super.dispatchTouchEvent(event);    }    @Override    protected void onDetachedFromWindow() {        super.onDetachedFromWindow();        // 停止图片滚动        stopImageCycle();    }    @Override    protected void onAttachedToWindow() {        super.onAttachedToWindow();        if (isAutoCycle) {            startImageCycle();        }    }    //自定义ViewPager,用于事件处理    public class ImageCycleViewPager extends ViewPager {        public ImageCycleViewPager(Context context) {            super(context);        }        public ImageCycleViewPager(Context context, AttributeSet attrs) {            super(context, attrs);        }        //事件拦截        @Override        public boolean onInterceptTouchEvent(MotionEvent ev) {            return super.onInterceptTouchEvent(ev);        }        //事件分发        @Override        public boolean dispatchTouchEvent(MotionEvent ev) {            getParent().requestDisallowInterceptTouchEvent(true);            return super.dispatchTouchEvent(ev);        }        //事件处理        @Override        public boolean onTouchEvent(MotionEvent ev) {            return super.onTouchEvent(ev);        }    }}

activity_main.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">    <com.bwie.myapplication.ImageCycleView        android:id="@+id/icv_topView"        android:layout_width="match_parent"        android:layout_height="200dp"/></RelativeLayout>

view_image_cycle.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="180dp">    <FrameLayout        android:id="@+id/fl_image_cycle"        android:layout_width="match_parent"        android:layout_height="match_parent">    </FrameLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="30dp"        android:layout_alignParentBottom="true"        android:background="#66666666"        android:gravity="center_vertical">        <LinearLayout            android:id="@+id/ll_indication_group"            android:layout_width="match_parent"            android:layout_height="10dp"            android:gravity="right"            android:orientation="horizontal"            android:paddingRight="15dp">        </LinearLayout>    </LinearLayout>    <TextView        android:id="@+id/tv_text"        android:layout_width="match_parent"        android:layout_height="30dp"        android:layout_alignParentBottom="true"        android:gravity="center_vertical"        android:paddingLeft="10dp"        android:textColor="#ffffffff"        android:textSize="15sp" /></RelativeLayout>

以上代码仅供参考


原创粉丝点击