(Android)触摸时使图像可见/不可见

时间:2013-08-15 04:34:08

标签: android ontouchlistener

这是我更新的代码。它现在根本没有检测到运动。也许我不应该让每个Image成为一个实例?基本上我想用户能够刷过所有图像,使它们消失。

感谢您的帮助。

package com.picomputing.mythirdapplication;

import android.content.Context;
import android.graphics.Color;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;

/**
 * Created by Paul on 8/13/13.
 */
public class Pin extends ImageView implements View.OnTouchListener {

    boolean isPinDown;

    public Pin(Context context) {
        super(context);
        this.isPinDown = false;
    }

    public Pin(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.isPinDown = false;
    }

    public Pin(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.isPinDown = false;
    }

    public boolean pinDown() {
        return this.isPinDown;
    }

    public void setPinDown() {
        this.isPinDown = true;
    }

    public void setPinUp() {
        this.isPinDown = false;
    }

    public void togglePin() {
        if (isPinDown == false)
        {
            isPinDown = true;
            this.setImageResource(Color.TRANSPARENT);
        }
        else
        {
            isPinDown = false;
            this.setImageResource(R.drawable.pin);
        }
    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_MOVE:
                int x = (int) event.getX();  //--relative to mLayout--
                int y = (int) event.getY();  //--relative to mLayout--
                Rect r = new Rect();
                view.getHitRect(r);
                    if(r.contains(x,y) && view instanceof ImageView){
                        togglePin();
                    }
        }
        return true;
    }
}

3 个答案:

答案 0 :(得分:1)

您需要监听并使用ACTION_MOVE个事件,以查看您想要更改的内容的父视图。

以下是ImageView中作为父母的LinerLayout个案例的示例:

public class test extends Activity {
    LinearLayout mLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mLayout = new LinearLayout(this);
        mLayout.setOrientation(LinearLayout.VERTICAL);

        for(int i = 0 ; i < 5; i++){
            ImageView iv = new ImageView(this);
            iv.setImageResource(android.R.drawable.ic_dialog_info);
            mLayout.addView(iv);
        }


        setContentView(mLayout);

        mLayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                switch (event.getAction()){
                    case MotionEvent.ACTION_MOVE:
                        int x = (int) event.getX();  //--relative to mLayout--
                        int y = (int) event.getY();  //--relative to mLayout--
                        Rect  r = new Rect();
                        for(int i = 0 ; i < mLayout.getChildCount(); i++){
                            View v = mLayout.getChildAt(i);
                            v.getHitRect(r);
                            if(r.contains(x,y) && v instanceof ImageView){
                                ((ImageView) v).setImageResource(android.R.drawable.ic_dialog_alert);
                            }
                        }

                }
                return true; //-- this means that view is interested in more events of all kinds--
            }
        });
    }


}

答案 1 :(得分:0)

我希望我没有误解你的问题 但如果您想要做的是阻止图像上的多点,您可以添加此属性

android:splitMotionEvents="false"

在imageview的父视图中的xml中。例如:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:splitMotionEvents="false" 
    >
 // YOUR IMAGE VIEW HERE
</LinearLayout>

如果您有任何问题可以在评论中随意询问:)

答案 2 :(得分:0)

OnTouch action_down,Action_move和Action_up主要有三个事件。对行动失败事件进行编码,即当用户触摸您的观点时。看这里的例子:

     @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        if (arg1.getAction()==MotionEvent.ACTION_DOWN) {

            //write your code here
        }
        else {
            if (arg1.getAction()==MotionEvent.ACTION_MOVE){

                do things

            }
            else {
                if (arg1.getAction()==MotionEvent.ACTION_UP){
                    do things
                }
            }
        }