【问题标题】:Canvas does not draw in Custom View画布不在自定义视图中绘制
【发布时间】:2012-09-04 10:20:55
【问题描述】:

我像这样创建了一个自定义视图 CircleView:

public class CircleView extends LinearLayout {

    Paint paint1;
    public CircleView(Context context) {
        super(context);
        init();
    }   
    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public void init() {
        paint1 = new Paint();
        paint1.setColor(Color.RED); 
    }       
    protected void onDraw(Canvas canvas) {
        //super.onDraw(canvas);         
        canvas.drawCircle(50, 50, 25, paint1);
        this.draw(canvas);  
    }
}

然后我将它包含在我的 Activity 的布局根<RelativeLayout>

  <com.turkidroid.test.CircleView
      android:id="@+id/circle_view"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" 
      android:layout_centerInParent="true"  />  

然而,什么都没有画出来!

  • 我实施自定义视图对吗?
  • 还是我使用自定义视图的方式?

一些信息:

  • CircleView 和 MyActivity 都在同一个包中:com.turkidroid.test
  • onDraw() 方法中,我尝试包含super.onDraw() 并对其进行评论。
  • 我知道我可以用更简单的方法画一个圆,但我的 CircleView 包含的不仅仅是画一个圆。我需要将其设为自定义视图。

【问题讨论】:

    标签: android android-canvas android-custom-view


    【解决方案1】:

    永远不会调用您的 onDraw 方法,您需要在自定义视图的构造函数上调用 setWillNotDraw(false) 才能实际调用 onDraw。

    如 Android SDK 所述:

    如果这个视图自己不做任何绘图,设置这个标志以允许 进一步优化。默认情况下,此标志未在 View 上设置,但 可以在某些 View 子类上设置,例如 ViewGroup。通常,如果 你覆盖 onDraw(android.graphics.Canvas) 你应该清除这个 标志。

    【讨论】:

    • 在我将方法添加到构造函数后,它会抛出java.lang.StackOverflowError!有什么想法吗?
    • 在我从我的代码中un-commented super.onDraw() 之后,您的建议就像一个魅力。谢谢!
    • 我不确定它是什么,我的 super.ondraw 调用丢失了,上面的标志也被设置为默认值,但是在输入这两个魔法之后发生了! ^_^
    • 我希望不止一次投赞成票...这对于自定义视图来说是一个可怕的问题...
    【解决方案2】:

    您的this.draw() 方法在哪里?

    这应该确实有效:

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);         
        canvas.drawCircle(50, 50, 25, paint1);
        //this.draw(canvas);  where is this method?
    }
    

    【讨论】:

    • this.draw()View.draw() 方法。还是不行!
    • 在我将setWillNotDraw(false) 添加到构造函数后,它确实有效!我不知道为什么!
    • 如果您需要自定义视图,则应始终从 View 扩展而不是从 LinearLayout 扩展,除非您也确实需要特定行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多