結構、誰も書いてない感じの大事な事を書いてます。
背景の色を変更
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で背景の色を変えるくらいに収めた方がよさげ