Thanks for the explanation. We worked around this behavior send separate messages to a Handler on the UI thread. I'm curious, though, to why Android doesn't handle the invalidate regions separately.
On Apr 9, 11:46 am, Romain Guy <romain...@google.com> wrote: > setText() invalidates the TextView entirely and when two invalidates > happen in the same UI event (as it is the case in your code), the > invalidate region becomes the union of the two original invalidate > regions. > > > > On Wed, Apr 8, 2009 at 6:40 PM, Leisuresuit Larry <larrywan...@gmail.com> > wrote: > > > Hi all, > > > We came across a strange behavior. The cliprectof our custom view is > > getting reset to its entire visible region, if we change the value of > > another view. > > > Below is a sample app to demonstrate the behavior: > > > main.xml: > > <?xml version="1.0" encoding="utf-8"?> > > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ > > android" > > android:orientation="vertical" > > android:layout_width="fill_parent" > > android:layout_height="fill_parent" > > > > > > <com.test.MyView > > android:id="@+id/view" > > android:layout_width="fill_parent" > > android:layout_height="100px" /> > > > <TextView > > android:id="@+id/text" > > android:layout_width="fill_parent" > > android:layout_height="wrap_content" /> > > > </LinearLayout> > > > ClipTest.java: > > package com.test; > > > import android.app.Activity; > > import android.os.Bundle; > > import android.view.KeyEvent; > > import android.widget.TextView; > > > public class ClipTest extends Activity { > > /** Called when the activity is first created. */ > > �...@override > > public void onCreate(Bundle savedInstanceState) { > > super.onCreate(savedInstanceState); > > setContentView(R.layout.main); > > } > > > �...@override > > public boolean onKeyDown(int keyCode, KeyEvent event) { > > TextView tv = (TextView)findViewById(R.id.text); > > tv.setText("Test"); > > > findViewById(R.id.view).invalidate(100, 0, 150, 75); > > return true; > > } > > } > > > MyView.java: > > package com.test; > > > import android.content.Context; > > import android.graphics.Canvas; > > import android.graphics.Rect; > > import android.util.AttributeSet; > > import android.view.View; > > > public class MyView extends View { > > > public MyView(Context context) { > > super(context); > > } > > > public MyView(Context context, AttributeSet attrs) { > > super(context, attrs); > > } > > > protected void onDraw(Canvas canvas) { > > super.onDraw(canvas); > > > Rectclip= canvas.getClipBounds(); > > System.out.println("clip" +clip); > > } > > } > > > If you run the above app, MyView.onDraw() prints "clipRect(0, 0, 320, > > 100)". If you comment out "tv.setText("Test");", then MyView.onDraw() > > prints "clipRect(100, 0, 150, 75)". > > > Why does setting the TextView's text affect MyView'scliprect? How > > can we get the correctcliprectin MyView.onDraw()? Thanks for any > > help! > > > Larry > > -- > Romain Guy > Android framework engineer > romain...@android.com > > Note: please don't send private questions to me, as I don't have time > to provide private support. All such questions should be posted on > public forums, where I and others can see and answer them --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---