我有一个活动和一个扩展的 View 类,它们都使用相同的 xml 布局。在扩展视图中,我通过触摸在屏幕上进行了一些绘图,并且希望在用户点击屏幕时将触摸的坐标 x 传递给 Activity。
到目前为止,我已经使用了一个 getter 方法并从 Activity 内部调用它,但它只传递了构造函数 X 的初始化值,而不是用户触摸的实际 X 坐标。
我很确定我错过了一些东西。你能给我一些方向吗?
编辑: 正如建议的那样,我尝试使用公共接口,而不是 getter 实践,但 X 仍然没有改变。这是我的代码:
我的自定义类:
public class ImageView1 extends View {
Context context;
ArrayList<ViewWasTouchedListener> listeners = new
ArrayList<ViewWasTouchedListener>();
ImageView1 img = (ImageView1) findViewById (R.id.imageView1);
public float x=0;
public float y=0;
public ImageView1(Context context) {
super(context);
this.context=context;
setFocusable(true);
}
public ImageView1(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
setFocusable(true);
}
@Override
public boolean onTouchEvent(MotionEvent event){
switch (event.getAction()){
case (MotionEvent.ACTION_DOWN): {
x = event.getX();
y = event.getY();
for (ViewWasTouchedListener listener:listeners){
Log.d("Touchpoint", String.valueOf(x) +"," + String.valueOf(y));
listener.onViewTouched(x);
}
}
return true;
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
....
}
public void setWasTouchedListener(ViewWasTouchedListener listener){
listeners.add(listener);
}
}
我的主要活动:
public class TargetPractise extends Activity implements ViewWasTouchedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.target_form);
ImageView1 value = new ImageView1(TargetPractise.this);
value.setWasTouchedListener(TargetPractise.this);
}
public void onViewTouched(float x){
Log.d("x",String.valueOf(x));
}
}
我的界面:
public interface ViewWasTouchedListener {
void onViewTouched(float x);
}
我的xml布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.archer.test.ImageView1
android:id="@+id/imageView1"
android:layout_width="300dip"
android:layout_height="300dip"
android:layout_gravity="center_horizontal"
android:background="@drawable/target" >
</android.archer.test.ImageView1>