自定义view是Android开发中一个非常重要的知识点,通过自定义view,我们可以实现各种各样的效果,满足不同的需求。其中,OnDraw方法是自定义view中最重要的一个方法,它负责绘制我们自定义的view的外观。在OnDraw方法中,我们可以改变view的高度,从而实现一些特定的效果。

首先,我们需要了解一下Android中自定义view的基本原理。Android中的view是由一个或多个绘制操作组成的,这些绘制操作通常在OnDraw方法中完成。在OnDraw方法中,我们可以使用Canvas对象进行绘制,通过绘制不同的图形、文字、图片等,来构建自定义view的外观。同时,我们也可以通过设置view的宽度和高度,来改变view的大小。

接下来,我们来看一个具体的例子。假设我们要实现一个自定义view,当用户点击view时,view的高度会变为原来的两倍。这个效果可以通过在OnDraw方法中改变view的高度来实现。

首先,我们需要创建一个自定义view的类,继承自View类。在该类中,我们需要重写OnDraw方法,并在其中绘制我们想要的外观。

public class MyCustomView extends View {

    private Paint mPaint;
    private int mViewWidth;
    private int mViewHeight;
    private boolean mIsClicked;

    public MyCustomView(Context context) {
        super(context);
        init();
    }

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

    public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mIsClicked = false;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mViewWidth = MeasureSpec.getSize(widthMeasureSpec);
        mViewHeight = MeasureSpec.getSize(heightMeasureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mIsClicked) {
            mViewHeight *= 2;
        }
        canvas.drawRect(0, 0, mViewWidth, mViewHeight, mPaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            mIsClicked = !mIsClicked;
            invalidate();
            return true;
        }
        return super.onTouchEvent(event);
    }
}

在上面的代码中,我们首先定义了一个Paint对象,用于绘制矩形。然后,在OnDraw方法中,我们根据mIsClicked的状态来决定是否改变view的高度。当mIsClicked为true时,我们将view的高度变为原来的两倍。最后,我们使用Canvas对象的drawRect方法来绘制一个填充色为红色的矩形。

接下来,我们需要在布局文件中使用这个自定义view。在布局文件中,我们可以设置自定义view的宽度和高度,并为其设置一个点击事件。

<LinearLayout xmlns:android="
    xmlns:tools="
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">

    <com.example.myapplication.MyCustomView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:clickable="true"
        android:focusable="true" />

</LinearLayout>

在上面的布局文件中,我们设置了自定义view的宽度和高度为200dp,并且将其设置为可点击和可获取焦点的。这样,在用户点击自定义view时,就会触发自定义view的点击事件。

最后,我们需要在Activity中加载布局文件,并将自定义view添加到布局中。

public class MainActivity extends AppCompatActivity {

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

通过上面的代码,我们就完成了一个简单的自定义view的实现。当用户点击自定义view时,view的高度会变为原来的两倍,从而实现了我们的需求。

下面是整个流