AndroidはTextView、ImageViewなどの押圧効果を実現


以前はボタンがたくさん押された状態で、selectorのxmlで配置されていましたが、この効果が必要なボタンが多すぎて、手間の省く方法を考えていました
次のようになります.
ImageView画像の押圧効果を実現
public class PressImageView extends ImageView {
public PressImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
public PressImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
private void init(Context context, AttributeSet attrs) {
//カスタム属性の取得
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PressImageView);
Drawable src_n = a.getDrawable(R.styleable.PressImageView_src_n);
Drawable src_s = a.getDrawable(R.styleable.PressImageView_src_s);
a.recycle();//リサイクルに注意
                
setImageDrawable(createDrawable(src_s, src_n));
}
public PressImageView(Context context) {
this(context, null);
}
//drawableの作成
public Drawable createDrawable(Drawable press, Drawable normal) {
StateListDrawable stateList = new StateListDrawable();
int statePressed = android.R.attr.state_pressed;
stateList.addState(new int[] { statePressed }, press);
stateList.addState(new int[] {}, normal);
return stateList;
}
}
TextViewの押圧効果:実現
public class PressTextView extends TextView {

   public PressTextView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      init(context, attrs);
   }

   public PressTextView(Context context, AttributeSet attrs) {
      this(context, attrs, 0);
   }

   private void init(Context context, AttributeSet attrs) {
      TypedArray a = context.obtainStyledAttributes(attrs,  R.styleable.PressImageView);

      Drawable src_n = a.getDrawable(R.styleable.PressImageView_src_n);
      Drawable src_s = a.getDrawable(R.styleable.PressImageView_src_s);
      a.recycle();


      setBackground(createDrawable(src_s, src_n));

//    setImageDrawable(createDrawable(src_s, src_n));
   }

   public PressTextView(Context context) {
      this(context, null);
   }

   public Drawable createDrawable(Drawable press, Drawable normal) {
      StateListDrawable stateList = new StateListDrawable();
      int statePressed = android.R.attr.state_pressed;
      stateList.addState(new int[] { statePressed }, press);
      stateList.addState(new int[] {}, normal);
      return stateList;
   }


}

レイアウトファイルの呼び出し方法:
宣言:
xmlns:xyh="http://schemas.android.com/apk/res-auto"

ImageViewの呼び出し:
<com.xyh.view.PressImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:clickable="true"
    android:layout_centerVertical="true"
    android:src="@drawable/sure_n"
    xyh:src_n="@drawable/sure_n"
    xyh:src_s="@drawable/sure_s" />

TextViewの呼び出し:
<com.xyh.view.PressTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="  "
    android:clickable="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="10dp"
    android:src="@drawable/btn_sure_n"
    android:textSize="@dimen/font_normal"

xyh
:src_n=
"@drawable/btn_sure_n"
xyh
:src_s=
"@drawable/btn_sure_s"/>
その他のコントロールも使用できます