LoginSignup
0
0

More than 5 years have passed since last update.

Androidアプリでpressを実装

Last updated at Posted at 2018-03-22

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

背景の色を変更

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で背景の色を変えるくらいに収めた方がよさげ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0