为什么此代码不会绘制用户在图像视图中触摸并将坐标输出到textview的圆圈?
package com.smallbore.smallbore;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.TextView;
public class targetenter extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.targetenter);
}
public class ImageView1 extends ImageView {
public int x;
public int y;
public ImageView1(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public boolean dispatchtouchevent(MotionEvent event){
x = (int) event.getX();
y = (int) event.getY();
TextView t1 = (TextView)findViewById(R.id.textView2);
t1.setText("x="+x);
TextView t2 = (TextView)findViewById(R.id.textView3);
t2.setText("y="+y);
invalidate();
return true;
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawCircle(x,y,10, null );
}
}
}
和xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/linearLayout1" android:layout_height="fill_parent" android:layout_width="fill_parent">
<TextView android:layout_height="wrap_content" android:text="@string/cposition" android:id="@+id/textView1" android:layout_width="wrap_content"></TextView>
<com.smallbore.smallbore.targetenter.Imageview1 android:id="@+id/imageView1" android:layout_width="300dip" android:layout_height="300dip" android:background="@drawable/target" android:layout_gravity="center_horizontal"></com.smallbore.smallbore.targetenter.Imageview1>
<TextView android:text="TextView" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
<TextView android:text="TextView" android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
</LinearLayout>
答案 0 :(得分:1)
将onTouchEvent
更改为dispatchTouchEvent
。另外,请确保您在XML中使用imageView1
,而不仅仅是ImageView
。
答案 1 :(得分:0)
您没有在onTouchEvent中调用invalidate()。当你在画布上改变某些东西时,它必须重新绘制。 fyi,如果你不在UI线程上,你必须调用postinvalidate()。请参阅此api演示以了解有关在画布上绘图的更多信息。 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.html
答案 2 :(得分:0)
我不确定Cristian建议使用dispatchTouchEvent()
是一个好的建议,这种方法在ViewGroup
后代中有意义地将调度触摸事件发送给其子节点。然而,他建议在xml布局声明中使用自定义视图很重要。你这样做:
<package.that.contains.targetenter.imageView1 android:id ....
也就是说,您需要为自定义ImageView
类指定完整包(顺便说一句,在Java中,使用大写字母表示类名的惯例为imageView1 -> ImageView1
)。如果您使用的是ImageView
,则只需使用它,我认为您必须将其公开或更好地在另一个文件中声明它。
要调用onDraw()
方法,您需要按照Veeresh的建议调用invalidate()
,以便重新绘制您的imageView1。但你必须称它为超级,否则你只会得到圆圈:
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawCircle(x,y,10, null );
}
如果您仍遇到问题,请查看targetenter.xml
布局。