天天看点

View绘制详解

一.Demo讲解

1.自定义View

public class MyTextView extends androidx.appcompat.widget.AppCompatTextView {


    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.d("MyTextView","onMeasure方法执行...");
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        Log.d("MyTextView","onLayout方法执行...");
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.d("MyTextView","onDraw方法执行...");
    }
}
           

2.布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.wjn.componentdemo.MyTextView
        android:id="@+id/TextView1"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="@color/cardview_shadow_start_color"
        android:gravity="center"
        android:text="TextView1"
        tools:ignore="MissingConstraints">

    </com.wjn.componentdemo.MyTextView>


</androidx.constraintlayout.widget.ConstraintLayout>
           

3.Activity使用

public class MainActivity extends AppCompatActivity {

    private MyTextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.TextView1);
        textView.setText("自定义View三个方法讲解");
    }
}
           

4.结果

D/MyTextView: onMeasure方法执行...


D/MyTextView: onLayout方法执行...


D/MyTextView: onDraw方法执行...
           

5.说明

本Demo中自定义的View。仅仅是重写了三个方法。用来说明一下三个方法的执行顺序。结果证明三个方法的执行顺序是:onMeasure,onLayout,onDraw。

也就是说,View的整个绘制流程可以分为以下三个阶段

<1> onMeasure:判断是否需要重新计算View的大小,需要的话则计算。

<2> onLayout:判断是否需要重新计算View的位置,需要的话则计算。

<3> onDraw:判断是否需要重新绘制View,需要的话则重绘制。

View绘制详解

二.onMeasure方法详解

https://blog.csdn.net/weixin_37730482/article/details/70568581

三.onLayout方法详解

https://blog.csdn.net/weixin_37730482/article/details/70243308

四.onDraw方法详解

https://blog.csdn.net/weixin_37730482/article/details/70323972

继续阅读