Android--自定义View类做一个按钮

一个视图从创建到显示过程中的主要方法
1,构造方法实例化类
2,测量measure(int,int)-->onMeasure();
    如果当前View是一个ViewGroup,还有义务测量孩子
    孩子有建议权
3,指定位置layout()-->onLayout();
    指定控件的位置,一般View不用写这个方法,ViewGroup的时候才需要,一般View不需要重写该方法
4,绘制视图-->draw()-->onDraw(canvas)
    根据上面两个方法参数,进入绘制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

显示在main布局里面:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CustomButton">

    <com.example.custombutton.MyToggleButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>

</RelativeLayout>

代码如下,其余不接受:

public class MyToggleButton extends View implements View.OnClickListener {

    private Bitmap backgroundBitmap;
    private Bitmap slidingBitmap;
    private int slidLeftMax;
    private Paint paint;
    private int slidLeft=0;

    //如果我们在布局文件中使用该类,将会用到这个构造方法实例该类,如果没有就奔溃
    public MyToggleButton(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    private void initView() {
        paint=new Paint();
        paint.setAntiAlias(true);//设置抗锯齿

        backgroundBitmap= BitmapFactory.decodeResource(getResources(), R.drawable.btn_1);
        slidingBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.zfx);
        slidLeftMax=backgroundBitmap.getWidth()-slidingBitmap.getWidth();

        //设置点击事件
        setOnClickListener(this);
    }


    //测量
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(backgroundBitmap.getWidth(),backgroundBitmap.getHeight());
    }

    //绘制
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawBitmap(backgroundBitmap, 0, 0, paint);
        canvas.drawBitmap(slidingBitmap, slidLeft, 150, paint);
    }



    private boolean inOpen=true;
    private boolean isEnableClick=true;

    @Override
    public void onClick(View v) {
        if(isEnableClick){
            inOpen=!inOpen;
            flushView();
        }
    }

    public void flushView() {

        if(inOpen){
            slidLeft=0;
            Toast.makeText(getContext(), "开", Toast.LENGTH_SHORT).show();
        }else{
            slidLeft=slidLeftMax;
            Toast.makeText(getContext(), "关", Toast.LENGTH_SHORT).show();
        }
        invalidate();//这个方法会导致onDraw()执行。
    }

    private float startX;
	//触摸监听
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                //记录起始位置
                startX=event.getX();
                isEnableClick=true;
                break;
            case MotionEvent.ACTION_MOVE:
                isEnableClick=false;
                //标记最后位置
                float endX=event.getX();
                //计算偏移量
                float distance= endX-startX;
                
                Log.e("TAG", ""+distance);
                slidLeft+= distance;
                if(slidLeft>slidLeftMax){
                    slidLeft=slidLeftMax;
                }else if(slidLeft<0){
                    slidLeft=0;
                }

                invalidate();

                //数据还原
                startX=getX();

                break;
            case MotionEvent.ACTION_UP:
                if(slidLeft>slidLeftMax/2){
                    inOpen=false;
                }else {
                    inOpen=true;
                }
                flushView();
                break;
        }
        return true;
    }
}

原创文章 158 获赞 2 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43616001/article/details/104829414