【问题标题】:Custom onDraw() method not called未调用自定义 onDraw() 方法
【发布时间】:2010-07-27 13:08:34
【问题描述】:
<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() 方法中从未命中断点,这是怎么回事?

【问题讨论】:

  • 你的Activity的代码是什么?也许问题在那里?
  • public class MyActivity extends Activity { // 你的成员变量声明在这里 // 首次创建活动时调用。 @Override public void onCreate(Bundle savedInstanceState) { // 你的代码在这里 super.onCreate(savedInstanceState); setContentView(R.layout.xmllayout); LinearLayout svll = (LinearLayout) findViewById(R.id.svLL); svll.setLayoutParams(new LinearLayout.LayoutParams(300, 300)); } }
  • 我把你的代码移到问题里了,这样更容易理解
  • 感谢klez,还没有人发现错误,一定是一些简单的错误:(
  • 有趣,我覆盖了 onLayout 和 onMeasure。在这些函数中遇到断点。但是对于 onLayout,底部为 0,右侧为 300,左侧为 0,顶部为 0。这是不调用 onDraw 的原因吗?没有使用xml的customview示例代码吗?

标签: android drawing


【解决方案1】:

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

【讨论】:

  • 这适用于视图组而不是视图
  • 为我工作。但有一个问题。我正在为我剪辑的View 制作动画。当onDraw 被覆盖时,视图会闪烁(看起来像是又被绘制了)。未剪辑时,它会平滑地动画。你能帮我解决这个问题吗?
【解决方案2】:

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

【讨论】:

  • 在我的情况下它不起作用, LinearLayoutCompat >> Horizo​​ntalScrollView >> LinearLayout >> CustomView 。 CustomView继承Textview时没有问题,但是扩展ConstrainLayout或LinearLayout时遇到问题
【解决方案3】:

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

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

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

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

【讨论】:

  • 确实,当维度为 0 时,不会调用 onDraw()。我正在使用返回 0 的 getSuggestedMinimumWidth()。然后我将它与 setMeasuredDimension() 一起使用来制作一个正方形......不用说,onDraw() 没有被调用。
【解决方案4】:

只需在初始时间修复自定义视图的layout_widthlayout_height,而不是wrap_contentfill_parent。 这对我有用。

【讨论】:

    【解决方案5】:

    大概

    setMinimumHeight(width);
    setMinimumWidth(height);
    

    未设置构造函数或未覆盖onMeasure()

    【讨论】:

      【解决方案6】:

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

      在您的 ViewGroup 构造函数调用中

      addView(mySubView);
      

      还记得在onLayout()中测量和布局您的子视图

      @Override
      protected void onLayout(boolean changed, int l, int t, int r, int b) {
          mySubview.measure(...);
          mySubview.layout(...);
      }
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

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

            setContentView(R.layout.xmllayout); 
            

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

            【讨论】:

              猜你喜欢
              • 2015-04-10
              • 2023-04-02
              • 1970-01-01
              • 2016-10-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-08
              相关资源
              最近更新 更多