访问同一类中的变量

时间:2012-11-16 16:33:43

标签: android

我有一个带按钮的自定义视图类,我让用户触摸屏幕,以便我可以检索坐标。我想要做的是,每当他点击按钮,将其文本设置为他的触摸坐标。我该怎么做?

public class TargetView extends RelativeLayout{
    .
    .
    .
    public float x=0;
    public float y=0;

    public TargetView(final Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    ((Activity)getContext())
        .getLayoutInflater()
        .inflate(R.layout.target_view, this, true);

    Target=findViewById(R.id.target);
    Undo=(Button)findViewById(R.id.undo_bt);

    Undo.setOnClickListener(new OnClickListener(){

        public void onClick(View v) {
            Log.d("x,y",(String.valueOf(x)+","+String.valueOf(y)));
            Undo.setText(String.valueOf(x)+","+String.valueOf(y));

        }

    });

        @Override
        public boolean onTouchEvent(MotionEvent event){

        switch (event.getAction()){
        case (MotionEvent.ACTION_DOWN): {

                 x = event.getX();
                 y = event.getY();
            }
            return false;
        } 
        . 
        .
        .
 }

修改 我在按钮监听器中添加了一个Log.d,似乎只有在用户触摸屏幕的其余部分并更改x,y(文本更改为“0.0”)之前,才会单击该按钮。

我的.xml文件:

   <?xml version="1.0" encoding="utf-8"?>
      <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.TargetView
        android:id="@+id/myTargetView"
        android:layout_width="300dip"
        android:layout_height="300dip"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/target" >
       </android.archer.test.TargetView> 

      </LinearLayout>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

  <View
       android:id="@+id/target"
       android:layout_width="300dp"
       android:layout_height="350dip" />

    <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
      android:id="@+id/undo_bt"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentBottom="true"
      android:layout_alignParentLeft="true"
          android:text="-" />

    </RelativeLayout>

2 个答案:

答案 0 :(得分:1)

- 在onTouchEvent方法结束时返回super.onTouchEvent(event)

<强>例如

@Override
    public boolean onTouchEvent(MotionEvent event){

    switch (event.getAction()){
    case (MotionEvent.ACTION_DOWN): {

             x = event.getX();
             y = event.getY();
        }
        return super.onTouchEvent(event);
    }

- 此外,还有Android维护的视图层次结构,并相应地处理事件。层次结构中的每个视图都会获取事件,但前提是父事件尚未使用。含义 - 如果您有一个处理onTouchEvent()的父视图并且每次都返回true,则子项永远不会收到该事件

答案 1 :(得分:0)

更改代码段中的return

   @Override
    public boolean onTouchEvent(MotionEvent event){

    switch (event.getAction()){
    case (MotionEvent.ACTION_DOWN): {

             x = event.getX();
             y = event.getY();
        }
        return false;
    } 

return true;

如果可能,您可以将日志放入onTouchEvent以查看它是否可以返回坐标。