llller
2011-09-02 00:59
浏览 358

为什么TextView.onDraw会被调用???

[code="xml"]
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="----"
/>
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="change"
/>


[/code]
[code="java"]
public class MyTextViewDemo extends Activity {
private MyTextView mt;
private Button btn;
private TextView tv;
private int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mt = (MyTextView) findViewById(R.id.text);
tv = (TextView) findViewById(R.id.title);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
tv.setText("adsf:" + i++);
}
});
}
}
[/code]
自定义TextView
[code="java"]
public class MyTextView extends TextView {

public MyTextView(Context context) {
    super(context);
}

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

public MyTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onDraw(Canvas canvas) {
    System.out.println("--------------- onDraw --------------");
    super.onDraw(canvas);
}

}
[/code]
现在的问题是,当点击button时,会改变title的值,但是MyTextView.onDraw也会被调用,而且点击几次就调用几次,这是为什么??

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • renpeng301 2011-09-02 23:13
    已采纳

    [code="java"]

    Drawing
    Drawing is handled by walking the tree and rendering each view that intersects the the invalid region.[color=red] Because the tree is traversed in-order, this means that parents will draw before (i.e., behind) their children, with siblings drawn in the order they appear in the tree.[/color] If you set a background drawable for a View, then the View will draw it for you before calling back to its onDraw() method.

    Note that the framework will not draw views that are not in the invalid region.

    To force a view to draw, call invalidate().

    [/code]

    打赏 评论
  • AngelAndAngel 2011-09-02 09:29

    因为你点击button,自动触发这个吧

    打赏 评论
  • AngelAndAngel 2011-09-02 09:40

    我觉得是不是因为text改变而触发 而是你button被点击把

    打赏 评论
  • weixin_42565855 2011-09-02 09:45

    [quote]我改title的值,跟text有什么关系..
    为什么会触发??
    是系统规定的?? [/quote]

    应该是textview的title改变,触发了onDraw操作重新绘制组件。

    打赏 评论
  • weixin_42565855 2011-09-02 10:46

    [quote]我定义了两个textview
    一个叫title; 一个是自定义的textview,叫text
    现在我改变了title的值,没有对自定义的textview坐任何操作,
    但是自定义的textview得onDraw方法还是会被调用...
    我就没搞懂了..[/quote]

    我猜测:两个textView都属于一个顶层容器,title变更,触发了
    顶层容器自上而下重新绘制。 :)
    最好你用debug工具单步跟踪看下。

    打赏 评论
  • Jack_tianzhenhai 2011-09-02 11:09

    android API中对onDraw的描述非常简单如下。 我用ddms跟踪了一下,也验证了一下其他的一些情况。和你改变title的值没有关系,你不停的按button,会发现只是在前面的几次才会去打印onDraw信息,这说明这个text的onDraw绘制应该是和整个layout的某种绘制机制有关。从源码上看可能和button的点击会更换background有关。

    protected void onDraw (Canvas canvas)
    Implement this to do your drawing.

    Parameters
    canvas the canvas on which the background will be drawn

    打赏 评论
  • iteye_3124 2011-09-02 14:40

    android中所谓的控件,其实底层都是绘制出来的,你想TextView中写入字符,那它本身的状态就改变了,也就是说他需要重绘控件。因为,只有重绘控件才能把你输入的字符显示出来,而重绘就需要调用onDraw方法。所以你在onDraw中输入log自然就会被打出来了。不知道楼主明白么有。

    对于你的补充问题:
    [b]“我定义了两个textview
    一个叫title; 一个是自定义的textview,叫text
    现在我改变了title的值,没有对自定义的textview坐任何操作,
    但是自定义的textview得onDraw方法还是会被调用...
    我就没搞懂了..”[/b]

    因为想要控件显示出来必然要控件本身要先绘制出来,而你自定义了TextView并重写了 onDraw方法,那自然在初始化的时候TextView需要绘制,自然就调用了onDraw方法。

    楼主看在谢了真么多的份上,不管对不对,给分吧!哈哈!

    打赏 评论
  • Jack_tianzhenhai 2011-09-02 17:25

    楼主其实不能理解是为什么button的点击会触发textview的onDraw方法,你可以看一下API或者源码,其实TextView也是继承了View类,而且onDraw是有最终的View类里的draw方法调用的。因此,button的点击应该是因此了View类的draw方法变化,从而有了上面的现象。

    打赏 评论
  • iteye_3124 2011-09-05 11:22

    "界面在初始化时,调用onDraw可以理解;改变控件的内容,是通过onDraw绘制的,也可以理解,现在的问题是,有两个textview,我对其中一个进行操作,为什么另一个的onDraw会被调用?

    另外触发button事件后,会更新整个界面吗??? "

    对于楼主的这个问题补充的这个问题,其实你可以这么理解,android界面的更新,其实并不是一个控件的更新,比方说,你要跟新一个view的状态,android会从跟节点布局开始重绘,逐层向里重绘,因为就算你一个view重绘后,跟节点布局不重新重绘,那同样也显示不出来你改变状态后的view。所以,你重绘了一个控件,实际上整个界面也都在重绘。这是我理解的。不知道楼主明白没有。

    打赏 评论

相关推荐 更多相似问题