自定义onDraw()方法未调用

时间:2010-07-27 13:08:35

标签: 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>

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);
    }
}

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));
    }

} 

我正在设置断点,但是onDraw()方法中的断点永远不会被击中,出了什么问题?

9 个答案:

答案 0 :(得分:86)

在MyDrawableView构造函数中添加setWillNotDraw(false)。原始答案是here

答案 1 :(得分:36)

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

答案 2 :(得分:15)

您需要@Override OnMeasure(int, int)方法通过调用setMeasuredDimension(int,int)来指定视图的大小。

如果不这样做,默认方法会将视图设置为大小为width=0 height=0。因此,甚至根本不打算拨打onDraw

OnMeasure方法调用setMeasuredDimension(int,int)来表示您的观点有多大。

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

答案 3 :(得分:3)

只需在自定义视图中layout_widthlayout_height进行一些修复,而不是wrap_contentfill_parent。 这对我有用。

答案 4 :(得分:0)

虽然我是android新手,但我仍然相信问题是因为

setContentView(R.layout.xmllayout); 

而不是"R.layout.xmllayout",传递MyDrawableView个对象(使用findViewById)并检查。 我没有尝试,但希望,它会起作用。

答案 5 :(得分:0)

您需要在构造函数方法中使用invalidate()来获取onDraw Called。

答案 6 :(得分:0)

设置自定义视图宽度后,应设置滚动宽度。

FMChart = (HKFMDrawChart)findViewById(R.id.fm_chart);
FMChart.setWidth(xxxx);
float scrollViewWidth = FMChart.getScrellViewWidth(); 
FMChart.setLayoutParams(new LinearLayout.LayoutParams(
      (int) (scrollViewWidth + HKApplication.getScreenWidth() / 2),
       LinearLayout.LayoutParams.WRAP_CONTENT));
FMChart.postInvalidate(); // onDraw(); 

答案 7 :(得分:0)

可能

setMinimumHeight(width);
setMinimumWidth(height);

在构造函数中未设置或onMeasure()未被覆盖。

答案 8 :(得分:0)

这是您的视图可能不出现的另一个原因。如果要使用子视图创建自定义ViewGroup,请记住将子视图添加到ViewGroup中。

在ViewGroup构造函数调用中

addView(mySubView);

还请记住在onLayout()

中测量和布置子视图
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    mySubview.measure(...);
    mySubview.layout(...);
}