示例代码:
View:
public class FirstView extends View{ private Paint mPaint; private int radiu = 100; private String TAG = FirstView.class.getName(); private void initPaint(){ mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setTextSize(getResources().getDimension(R.dimen.DIMEN_80PX)); mPaint.setColor(getResources().getColor(R.color.color_red)); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5f); mPaint.setAlpha(50); } public FirstView(Context context) { super(context); Log.i(TAG, "----------- Constructors—01 -----------"); initPaint(); } /** * View 构造函数 */ public FirstView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); Log.i(TAG, "----------- Constructors—02 -----------"); initPaint(); } /** * View 构造函数 */ @Override protected void onFinishInflate() { super.onFinishInflate(); Log.i(TAG, "----------- onFinishInflate -----------"); } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); Log.i(TAG, "----------- onWindowFocusChanged -----------"); } @Override protected void onFocusChanged(boolean gainFocus, int direction, @Nullable Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); Log.i(TAG, "----------- onFocusChanged -----------"); } @Override protected void onVisibilityChanged(@NonNull View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); Log.i(TAG, "----------- onVisibilityChanged -----------"); } @Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); Log.i(TAG, "----------- onWindowVisibilityChanged -----------"); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); Log.i(TAG, "----------- onDetachedFromWindow -----------"); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); Log.i(TAG, "----------- onAttachedToWindow -----------"); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); Log.i(TAG, "----------- onMeasure -----------"); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); Log.i(TAG, "----------- onSizeChanged -----------"); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); Log.i(TAG, "----------- onLayout -----------"); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Log.i(TAG, "----------- onDraw -----------"); canvas.drawRect(400, 100, 600, 600, mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } }
Activity:
public class CustomViewActivity extends AppCompatActivity { private LinearLayout layoutSecond; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_view); initView(); } private void initView(){ layoutSecond = (LinearLayout) findViewById(R.id.layout_second); FirstView firstView = new FirstView(this); layoutSecond.addView(firstView); } }
xml布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_weight="1"> <!--<com.wdp.designtest.view.custom_view.FirstView android:layout_width="wrap_content" android:layout_height="wrap_content" />--> </LinearLayout> <LinearLayout android:id="@+id/layout_second" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_weight="1"> </LinearLayout> </LinearLayout>
运行结果:
1. View在xml布局文件中
03-15 14:31:17.887 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- Constructors—02 -----------
03-15 14:31:17.888 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onFinishInflate -----------
03-15 14:31:17.910 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onAttachedToWindow -----------
03-15 14:31:17.910 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onWindowVisibilityChanged -----------
03-15 14:31:17.910 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onVisibilityChanged -----------
03-15 14:31:17.913 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onMeasure -----------
03-15 14:31:17.913 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onMeasure -----------
03-15 14:31:17.942 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onMeasure -----------
03-15 14:31:17.942 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onMeasure -----------
03-15 14:31:17.942 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onSizeChanged -----------
03-15 14:31:17.942 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onLayout -----------
03-15 14:31:17.947 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onWindowFocusChanged -----------
03-15 14:31:17.962 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onDraw -----------
03-15 14:34:25.135 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onWindowFocusChanged -----------
03-15 14:34:25.231 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onWindowVisibilityChanged -----------
03-15 14:34:25.657 29347-29347/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onDetachedFromWindow -----------
2. View 在代码中添加
03-15 14:36:04.798 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- Constructors—01 -----------
03-15 14:36:04.845 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onAttachedToWindow -----------
03-15 14:36:04.846 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onWindowVisibilityChanged -----------
03-15 14:36:04.846 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onVisibilityChanged -----------
03-15 14:36:04.854 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onMeasure -----------
03-15 14:36:04.854 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onMeasure -----------
03-15 14:36:04.880 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onMeasure -----------
03-15 14:36:04.880 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onMeasure -----------
03-15 14:36:04.881 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onSizeChanged -----------
03-15 14:36:04.882 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onLayout -----------
03-15 14:36:04.902 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onWindowFocusChanged -----------
03-15 14:36:04.908 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onDraw -----------
03-15 14:36:08.654 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onWindowFocusChanged -----------
03-15 14:36:08.768 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onWindowVisibilityChanged -----------
03-15 14:36:09.181 29688-29688/com.wdp.designtest I/com.wdp.designtest.view.custom_view.FirstView: ----------- onDetachedFromWindow -----------