0 0

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
	android:id="@+id/title"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="----"
    />
<com.myTextViewDemo.MyTextView
	android:id="@+id/text"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
/>
<Button
	android:id="@+id/btn"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="change"
/>

</LinearLayout>

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

自定义TextView
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);
	}
}

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

问题补充:
AngelAndAngel 写道
因为你点击button,自动触发这个吧


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

问题补充:
nju_abc 写道
引用
我改title的值,跟text有什么关系..
为什么会触发??
是系统规定的??


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


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

问题补充:
AngelAndAngel 写道
我觉得是不是因为text改变而触发 而是你button被点击把


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

button被点击会对自定义的textview产生影响???

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

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


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

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


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

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

问题补充:
renpeng301 写道

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



这意思是不是说:只要有重叠,那么重叠控件所在层的所有控件和其父控件都会被重绘????
我做了实验,好像是这么回事..
不知道上面是不是这样讲的,我英文不好,只看个半懂..

2011年9月02日 00:59

9个答案 按时间排序 按投票排序

0 0

采纳的答案


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

2011年9月02日 23:13
0 0

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

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

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

2011年9月05日 11:22
0 0

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

2011年9月02日 17:25
0 0

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

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


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

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

2011年9月02日 14:40
0 0

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 

2011年9月02日 11:09
0 0

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


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

2011年9月02日 10:46
0 0

引用
我改title的值,跟text有什么关系..
为什么会触发??
是系统规定的??


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

2011年9月02日 09:45
0 0

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

2011年9月02日 09:40
0 0

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

2011年9月02日 09:29

相关推荐

    安卓textView相关-自动识别url的TextView.rar

    - 可以通过重写`TextView`的`onDraw()`方法来检测文本中的URL,并使用`Canvas.drawText()`绘制链接样式。 - 另一种方式是覆写`TextView`的`getPaintFlags()`,在其中添加`Paint.UNDERLINE_TEXT_FLAG`来开启下划线...

    安卓textView相关-自定义垂直循环滚动Textview.rar

    在postInvalidate()被调用时,我们检查文本是否已经滚动到边界,如果是,则反向滚动,从而实现循环滚动的效果。 此外,这个自定义的TextView可能还包含了其他功能,比如设置滚动速度、滚动方向、文本间距等,这些都...

    可设置左右文本的TextView.zip

    1. **创建自定义View类**:在Android Studio中,我们首先会创建一个新的Java类,继承自TextView。在这个类中,我们将添加额外的功能和属性。 2. **重写onDraw()方法**:这是自定义视图的核心,因为我们需要在这里...

    应用源码之textView.zip

    TextView的绘制过程主要在`onDraw()`方法中完成,该方法调用了Canvas的drawText()方法绘制文本。文本的样式(如字体、颜色、阴影)和位置都在此阶段确定。此外,对于多行文本,TextView还需要处理换行、折行等逻辑。...

    Android类似星球大战字幕效果的TextView.zip

    开发者可能会创建一个继承自TextView的自定义类,并重写onDraw()方法,以此来控制文字的绘制过程。在这个方法中,可以利用Canvas对象来画出逐行滚动的文字。 实现滚动效果的关键在于理解和使用Android的动画系统。...

    TextView.rar

    自定义TextView的核心在于重写`onDraw()`方法。在这个方法中,你可以控制文本的绘制过程,比如改变文字的绘制颜色、绘制位置,甚至添加动画效果。使用`Canvas`对象,你可以调用`drawText()`方法来绘制文本,并通过`...

    Android自定义TextView带圆角边框颜色(动态更改边框颜色)

    在`onDraw`方法中,我们首先调用`super.onDraw`绘制文本,然后根据圆角半径是否大于零决定是否使用`Path`和`addRoundRect`来创建一个带有圆角的矩形,并通过`canvas.clipPath`裁剪画布。最后,使用`canvas.drawPaint...

    Android实现TextView文字滚动.zip

    创建一个继承自TextView的自定义View,重写onDraw()方法,在其中计算并应用滚动偏移量,然后调用invalidate()方法触发重绘,以实现文本的手动滚动。 **注意事项** - Marquee效果可能不会立即启动,可能需要等待一...

    自定义TextView解决排版混乱

    // 注意:这里需要调用super.onDraw(canvas),确保父类的绘制行为不会被覆盖 super.onDraw(canvas); } } ``` 在`onDraw()`方法中,我们可以使用`canvas.drawText()`方法来绘制文本,通过设置不同的坐标、颜色、...

    自定义控件_滚动的TextView

    // 设置TextView的宽度为文本的宽度,以便可以完整显示所有内容 setMeasuredDimension(getPaint().measureText(getText().toString()), getMeasuredHeight()); } ``` 此外,我们还需要处理一些细节,例如在滚动...

    实现textView跑马灯

    5. **注意事项**:跑马灯效果在文本内容改变后可能不会自动启动,需要手动调用`textView.startMarquee()`。另外,如果TextView的宽度不足以显示整个文本,跑马灯效果才会生效。因此,可能需要设置一个合适的固定宽度...

    自定义带边框的TextView

    在`init()`方法中,我们初始化了这些属性,并在`onDraw()`方法中覆盖了父类的实现,先调用`super.onDraw(canvas)`绘制原有文本,然后使用`canvas.drawRect()`来绘制边框。 要将这个自定义TextView添加到布局中,...

    代码实现圆角Textview

    `onDraw()`方法绘制了带圆角的矩形背景,然后调用`super.onDraw(canvas)`来绘制文本。 接下来,我们可以实现点击按钮背景色改变的功能。这通常涉及到设置TextView的状态监听器,如OnClickListener。当用户点击...

    一键删除的TextView

    然而,在许多应用界面设计中,用户可能需要快速清除`TextView`中的所有内容,这时“一键删除”功能就显得尤为实用。本教程将详细介绍如何为`TextView`添加一键删除功能,让用户只需点击一个按钮或执行特定操作就能...

    自定义的TextView,简单学习自定义View

    本教程以“自定义的TextView”为例,旨在帮助初学者理解如何进行自定义View的基本操作。 首先,自定义TextView是扩展了Android原生TextView类的自定义组件。通过继承TextView,我们可以对原有功能进行增强或添加新...

    带图像的TextView

    在这个方法里,我们会先调用父类的 `onDraw()` 方法来绘制文本,然后根据需求在合适的位置上画出图像: ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制文本 // 获取...

    自定义TextView实现首行缩进

    在onDraw方法中,首先调用父类(即TextView)的onDraw方法,确保默认的文本绘制行为不受影响。然后获取文本内容,测量文本宽度,判断是否需要进行首行缩进。 3. **计算缩进**: 可以根据需求设置缩进的像素值,...

    android 逐行显示自动换行的textview

    要实现逐行逐字显示的功能,我们可以创建一个自定义的TextView子类,重写`onDraw()`方法来控制文本的绘制过程。在这个方法里,我们可以控制文本的显示速度,每次只绘制一行或一个字符。此外,还需要维护一个内部状态...

    广告竖直滑动的单TextView效果

    这样,每当定时任务执行时,TextView就会重新绘制,展现出滚动的效果。 5. 如果需要控制滚动速度,可以在定时任务中添加延时,例如使用`postDelayed()`方法设置延迟时间。 在实际开发中,可能还需要处理一些边界...

    TextView上下自动滚动(一行一行跳动)

    当我们需要在有限的屏幕空间内展示大量的文本,而这些文本又不能完全显示时,`TextView` 的滚动功能就显得尤为重要。本篇文章将深入探讨如何实现`TextView`的上下自动滚动效果,也就是一行一行地跳动。 首先,我们...

Global site tag (gtag.js) - Google Analytics