如何在ImageView上绘图

时间:2011-02-26 16:35:27

标签: android

为什么此代码不会绘制用户在图像视图中触摸并将坐标输出到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>

3 个答案:

答案 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布局。