天天看點

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

繼續閱讀