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の押圧効果:実現
レイアウトファイルの呼び出し方法:
宣言:
ImageViewの呼び出し:
TextViewの呼び出し:
xyh
:src_n=
"@drawable/btn_sure_n"
xyh
:src_s=
"@drawable/btn_sure_s"/>
その他のコントロールも使用できます
次のようになります.
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"/>
その他のコントロールも使用できます