自定义onDraw()方法未调用

myn*_*pny 42 android drawing

<LinearLayout android:id="@+id/svLL" android:orientation="horizontal"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <ScrollView android:id="@+id/sv"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        xmlns:android="http://schemas.android.com/apk/res/android">
        <!--
            <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/scrollbar_2_text" />
        -->
        <com.mypackage.MyDrawableView
            android:layout_width="fill_parent" android:layout_height="wrap_content" />
    </ScrollView>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
public class MyDrawableView extends View {

    Context thisContext;

    public MyDrawableView(Context context, AttributeSet attr) {
        super(context);
        thisContext = context;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        final Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setTextSize(12);
        canvas.drawText("Blah blah", 0, 100, paint);
    }
}
Run Code Online (Sandbox Code Playgroud)
public class MyActivity extends Activity {
    // Your member variable declaration here
    // Called when the activity is first created.
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // Your code here super.onCreate(savedInstanceState);
        setContentView(R.layout.xmllayout);
        LinearLayout svll = (LinearLayout) findViewById(R.id.svLL);
        svll.setLayoutParams(new LinearLayout.LayoutParams(300, 300));
    }

} 
Run Code Online (Sandbox Code Playgroud)

我正在设置一个断点,但是断点在onDraw()方法内部从未被击中,出了什么问题?

Dra*_*vić 93

添加setWillNotDraw(false)MyDrawableView构造函数.原来的答案在这里.

  • 这适用于viewgroup not view (14认同)

Rom*_*Guy 36

您的视图的高度为0.您可以将视图设置为具有height=wrap_content,但不要覆盖onMeasure()以告知UI工具包您的视图有多大.


小智 15

你需要@OverrideOnMeasure(int, int)方法调用指定您的视图的大小setMeasuredDimension(int,int).

如果不这样做,则默认方法会将视图设置为具有大小width=0 height=0.因此,甚至根本不打电话onDraw.

OnMeasure方法调用setMeasuredDimension(int,int),它告诉你有多大的视图.

(所以你需要在方法上获得android屏幕的大小OnMeasure并相应地调用setMeasuredDimension).