自定义控件

来源:互联网 发布:php高并发redis 编辑:程序博客网 时间:2024/06/14 06:28
public class MyView extends View{    Paint paint;    int downX;    int downY;    Bitmap bm;    private void init(){        paint = new Paint();        //设置抗锯齿        paint.setAntiAlias(true);    }    /**     *     * @param context     */    public MyView(Context context) {        super(context);        init();    }    /**     * 有两个参数的构造方法  才能让控件xml布局中进行定义     * @param context     * @param attrs     */    public MyView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    /**     * 在控件中进行绘制的方法     * 1、画笔  Paint     * 2、画板  canvas     * @param canvas     */    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //在屏幕上画一条线        canvas.drawLine(downX + 0,downY + 0,downX + 100,downY + 100,paint);        //在屏幕上画一个矩形        paint.setStyle(Paint.Style.STROKE);        paint.setColor(Color.RED);        canvas.drawRect(downX + 30,downY + 30, downX + 200,downY + 200,paint);        //在屏幕上画一个○        paint.setColor(Color.BLUE);        canvas.drawCircle(downX + 100,downY + 100,50,paint);        //画一个圆弧        RectF f = new RectF();        f.set(downX + 100,downY + 50,downX + 200,downY + 150);        canvas.drawArc(f, 90, 180, false , paint);        canvas.drawArc(f, -45, 90, true , paint);        if(bm == null){            bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);        }        canvas.drawBitmap(bm, downX + 200,downY + 200,paint);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        int widthMode = MeasureSpec.getMode(widthMeasureSpec);        int heightMode = MeasureSpec.getMode(heightMeasureSpec);        int width;        int height;        switch (widthMode){            case MeasureSpec.AT_MOST:                width = MeasureSpec.getSize(widthMeasureSpec);                Log.i("AT_MOST========", "onMeasure: width:" + width);                break;            case MeasureSpec.EXACTLY:                width = MeasureSpec.getSize(widthMeasureSpec);                Log.i("EXACTLY========", "onMeasure: width:" + width);                break;            case MeasureSpec.UNSPECIFIED:                width = MeasureSpec.getSize(widthMeasureSpec);                Log.i("UNSPECIFIED========", "onMeasure: width:" + width);                break;        }        switch (heightMode){            case MeasureSpec.AT_MOST:                height = MeasureSpec.getSize(heightMeasureSpec);                Log.i("AT_MOST========", "onMeasure: height:" + height);                break;            case MeasureSpec.EXACTLY:                height = MeasureSpec.getSize(heightMeasureSpec);                Log.i("EXACTLY========", "onMeasure: height:" + height);                break;            case MeasureSpec.UNSPECIFIED:                height = MeasureSpec.getSize(heightMeasureSpec);                Log.i("UNSPECIFIED========", "onMeasure: height:" + height);                break;        }    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                downX = (int) event.getX();                downY = (int) event.getY();                bm = BitmapFactory.decodeResource(getResources(), R.mipmap.a);                //重新绘制图形                invalidate();                break;            case MotionEvent.ACTION_MOVE:                downX = (int) event.getX();                downY = (int) event.getY();                //重新绘制图形                invalidate();                break;            case MotionEvent.ACTION_UP://                bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);                downX = (int) event.getX();                downY = (int) event.getY();                //重新绘制图形                invalidate();                //4、在需要回调的位置  使用静态接口变量调用接口中的抽象方法                listener.onClick();                break;        }        return true;    }    //3、定义一个全局的 接口类型变量    public OnMyViewClickListener listener;    //1、定义个接口    public interface OnMyViewClickListener{        public void onClick();    }    //2、定义一个接受接口类型参数的方法    public void setOnMyViewClickListener(OnMyViewClickListener listener){        this.listener = listener;    }}