一分钟实现轮播图

来源:互联网 发布:linux cp几个文件 编辑:程序博客网 时间:2024/05/22 01:41
package com.yijin.timetrade.base;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.os.CountDownTimer;import android.os.Handler;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import java.util.ArrayList;import java.util.List;/** * 轮播图抽象类 */public abstract class BaseBanner extends View {    private List<? extends Object> imgbitm;    private ArrayList<String> imgbitm1;    private boolean A = true;    private ArrayList<Bitmap> Bitmap;    public ArrayList<android.graphics.Bitmap> getBitmap() {        return Bitmap;    }    private int posin = 0;    private Paint paint;    private Rect rect, rects;    private Rect laft, regiht;    private Bitmap map = null;    private boolean l = false, r = false;    private boolean aBoolean = true;    private int getPosin() {        if (Bitmap != null)            if (posin >= Bitmap.size()) {                posin = 0;            } else if (posin < 0) {                posin = Bitmap.size() - 1;            }        return posin;    }    private int bbq = 1;    protected Context context;    public BaseBanner(Context context, AttributeSet attrs) {        super(context, attrs);        this.context = context;        // TODO Auto-generated constructor stub    }    @Override    protected void onDraw(Canvas canvas) {        if (Bitmap != null && Bitmap.size() != 0 && Bitmap.get(0) != null) {            if (posin >= Bitmap.size()) {                posin = 0;            } else if (posin < 0) {                posin = Bitmap.size() - 1;            }            if (A) {                A = false;                paint = new Paint();                paint.setStrokeJoin(Paint.Join.ROUND);                paint.setAntiAlias(true);                paint.setDither(true);                rects = new Rect(0, 0, getWidth(), getHeight());                rect = new Rect(0, 0, getWidth(), getHeight());                laft = new Rect(0 - getWidth(), 0, 0, getHeight());                regiht = new Rect(0 - getWidth(), 0, 0, getHeight());                canvas.drawBitmap(Bitmap.get(posin), rects, rect, paint);            } else {                if (posin >= Bitmap.size()) {                    posin = 0;                } else if (posin < 0) {                    posin = Bitmap.size() - 1;                }                canvas.drawBitmap(Bitmap.get(posin), rects, rect, paint);                if (r)                    if (posin >= Bitmap.size() - 1)                        canvas.drawBitmap(Bitmap.get(0), rects, regiht, paint);                    else                        canvas.drawBitmap(Bitmap.get(posin + 1), rects, regiht, paint);                if (l)                    if (posin <= 0)                        canvas.drawBitmap(Bitmap.get(Bitmap.size() - 1), rects, laft, paint);                    else                        canvas.drawBitmap(Bitmap.get(posin - 1), rects, laft, paint);            }            DrawPageNumber(Bitmap.size(), posin, canvas);        }        super.onDraw(canvas);    }    public BaseBanner setabcLunBo(ArrayList<Bitmap> Bitmap, List<? extends Object> imgbitm) {//参数二为对应的网址        if (Bitmap == null)            A = false;        this.Bitmap = Bitmap;        this.imgbitm = imgbitm;        if (Bitmap.size() >= 2 && aBoolean) {            handler.sendEmptyMessageDelayed(0, getTime());//启动handler,实现4秒定时循环执行            aBoolean = false;        }        invalidate();        return this;    }    private JISUAN j;    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                j = new JISUAN();                j.ACTION_DOWN((int) event.getX());                System.out.println(event.getX() + "-------------");                break;            case MotionEvent.ACTION_MOVE:                isChange = false;                int aa = j.ACTION_MOVE((int) event.getX());                if (aa < 0) {                    laft = new Rect(0 - getWidth() - aa, 0, 0 - aa, getHeight());                    l = true;                    r = false;                } else {                    r = true;                    l = false;                    regiht = new Rect(getWidth() - aa, 0, 2 * getWidth() - aa, getHeight());                }                rect = new Rect(0 - aa, 0, getWidth() - aa, getHeight());                invalidate();                break;            case MotionEvent.ACTION_UP:                l = false;                r = false;                isChange = true;//                laft = new Rect(0 - getWidth(), 0, 0, getHeight());//                regiht = new Rect(0 - getWidth(), 0, 0, getHeight());                rect = new Rect(0, 0, getWidth(), getHeight());                switch (j.ACTION_UP((int) event.getX())) {                    case -1:                        posin--;                        break;                    case 0:                        break;                    case 1:                        posin++;                        break;                    default:                        break;                }                if (Bitmap != null && -50 <= j.ACTION_MOVE((int) event.getX()) && j.ACTION_MOVE((int) event.getX()) <= 50) {//点击时跳转,移动时不跳转                    OnClickItemImage(getPosin(), imgbitm);                }                break;        }        invalidate();        return true;    }    protected CountDownTimer cdt = new CountDownTimer(100, 20) {        @Override        public void onTick(long millisUntilFinished) {            r = true;            l = false;            bbq++;            int aa = getWidth() / 10;            regiht = new Rect(getWidth() - aa * bbq, 0, 2 * getWidth() - aa * bbq, getHeight());            rect = new Rect(0 - aa * bbq, 0, getWidth() - aa * bbq, getHeight());            invalidate();        }        @Override        public void onFinish() {            posin++;            bbq = 1;            rect = new Rect(0, 0, getWidth(), getHeight());            l = false;            r = false;            invalidate();        }    };    boolean isChange = true;    private Handler handler = new Handler() {        public void handleMessage(android.os.Message msg) {            if (isChange && Bitmap.size() > 1) {                //逻辑处理                cdt.start();            }            handler.sendEmptyMessageDelayed(0, getTime());//3秒后再次执行        }    };    class JISUAN {        private int point1, point2, point3;        public int getPoint1() {            return point1;        }        public int getPoint2() {            return point2;        }        public int getPoint3() {            return point3;        }        public void ACTION_DOWN(int point) {            this.point1 = point;        }        public int ACTION_MOVE(int point2) {            this.point2 = point2;            return jisuan(this.point1, this.point2);        }        public int ACTION_UP(int point3) {            this.point3 = point3;            if (jisuan(this.point1, this.point3) < -getWidth() / 3) {                return -1;            } else if (jisuan(this.point1, this.point3) > getWidth() / 3) {                return 1;            } else {                return 0;            }        }        public int jisuan(int point11, int point22) {            System.out.println("point11+" + point11 + "point22+" + point22);            return point11 - point22;        }    }    /**     * 点击事件处理     * @param pson     * @param objects     */    protected abstract void OnClickItemImage(int pson, List<? extends Object> objects);    /**     * 可扩展方法里面可以添加你的自定义操作     * @param size     * @param pson     * @param canvas     */    protected abstract void DrawPageNumber(int size, int pson, Canvas canvas);    /**     * 单位毫秒     *     * @return     */    protected abstract int getTime();    /**     * 添加底部小点     * @param size     * @param pson     * @param canvas     */    protected void  addButPoint(int size, int pson, Canvas canvas){        int buttton = (int) canvas.getHeight() - 20;        int width = (int) (canvas.getWidth() /3)/ (size+1);        int jiange = width / (size+1);        Paint pan = new Paint();        pan.setColor(Color.BLUE);        Paint pan2 = new Paint();        pan2.setColor(Color.WHITE);        for (int i = 0; i < size; i++) {            RectF r2 = new RectF();                           //RectF对象            r2.left = canvas.getWidth()/3+jiange*(i+1)+ width*i;                          //左边            r2.top = buttton-10;                                     //上边            r2.right = canvas.getWidth()/3+jiange*(i+1)+ width*(i+1);;                                   //右边            r2.bottom = buttton;            if (i != pson)                canvas.drawRoundRect(r2, 10, 10, pan2);            else                canvas.drawRoundRect(r2, 10, 10, pan);        }    }}
/**************************************快速集成区,直接继承BaseBanner即可集成**************************************************************************/
package com.yijin.timetrade.viewmodel;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.util.AttributeSet;import com.yijin.timetrade.R;import com.yijin.timetrade.base.BaseBanner;import com.yijin.timetrade.utils.NativeUtils;import java.util.List;/** * Created by Administrator on 2017/12/4. */public class Banner extends BaseBanner {    public Banner(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public void OnClickItemImage(int pson, List<?> objects) {//        NativeUtils.get(context, objects.get(pson).toString());//点击事件处理区    }    @Override    public void DrawPageNumber(int size, int pson, Canvas canvas) {        /**         * 添加底部小点         */        addButPoint(size, pson, canvas);    }    /**     * 设置轮播速度,单位毫秒     * @return     */    @Override    public int getTime() {        return 3000;    }}
/*****************************************************************
使用方法
Banner banner=findViewById(R.id.banner);//初始化
ArrayList<Bitmap> bitmaps=new ArrayList<>();ArrayList<String> url=new ArrayList<>();
banner.setabcLunBo(bitmaps,url);//添加数据源