一.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,需要的话则重绘制。
二.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