一个视图从创建到显示过程中的主要方法
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;
}
}