アクティビティと拡張Viewクラスがあり、どちらも同じxmlレイアウトを使用しています。拡張ビューでは、タッチを使用して画面上でいくつかの描画を行い、ユーザーが画面をタップするたびに、タッチの座標xをアクティビティに渡したいと考えています。
これまで、getterメソッドを使用してアクティビティ内から呼び出してきましたが、これは、ユーザーが触れた実際のX座標ではなく、コンストラクターのXの初期値のみを渡します。
私は何かが足りないと確信しています。道順を教えていただけますか?
編集: 提案されたように、ゲッターの練習の代わりに、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>