Android

Androidアプリでpressを実装

結構、誰も書いてない感じの大事な事を書いてます。

背景の色を変更

drawableに

qiita.xml
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <color android:color="#330000" />
    </item>
    <item android:state_pressed="false">
        <color android:color="#ff0000" />
    </item>
</selector>

で背景にこれを指定。

すると押してる間背景の色が変わる。

次に

対象の透過度を変更する。

qiita.java
VIEW.setOnTouchListener(new View.OnTouchListener() {
    private Rect rect;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            v.setAlpha(0.6f);
            rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
        }else if(event.getAction() == MotionEvent.ACTION_UP){
            v.setAlpha(1.0f);
        }else if(event.getAction() == MotionEvent.ACTION_MOVE){
            if(!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())){
                v.setAlpha(1.0f);
            }
        }
        return false;
    }
});

これで押してる間は色が薄くなってくれる。

対象の画像に色を載せる

qiita.java
VIEW.setOnTouchListener(new View.OnTouchListener() {
    private Rect rect;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            ((ImageView) v).setColorFilter(Color.argb(10, 0, 0, 0));
            rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
        }else if(event.getAction() == MotionEvent.ACTION_UP){
            ((ImageView)v).setColorFilter(Color.argb(0, 0, 0, 0));
        }else if(event.getAction() == MotionEvent.ACTION_MOVE){
            if(!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())){
                ((ImageView) v).setColorFilter(Color.argb(0, 0, 0, 0));
            }
        }
        return false;
    }
});

これはちょっと黒くするサンプル

対象を小さくする

qiita.java
VIEW.setOnTouchListener(new View.OnTouchListener() {
    private Rect rect;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            v.setScaleX(0.9f);
            v.setScaleY(0.9f);
            rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
        }
        if(event.getAction() == MotionEvent.ACTION_UP){
            v.setScaleX(1.0f);
            v.setScaleY(1.0f);
        }
        if(event.getAction() == MotionEvent.ACTION_MOVE){
            if(!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())){
                v.setScaleX(1.0f);
                v.setScaleY(1.0f);
            }
        }
        return false;
    }
});

これでほとんどの場合OK

問題はGridViewとかListViewの要素に対してtouchListenerが干渉してうまくいかない。
touchlistenrでreturn trueとかにしてクリックとかの制御も合わせてタッチ内で行うか、無難にdrawbleで背景の色を変えるくらいに収めた方がよさげ