URLから取得したビットマップを設定したイメージビューがあります。 imageviewで、ダイアログを開くonClickListenerを設定しました。
Imageviewが押されたときに色合いを何らかの方法で変更(暗くする)して、一種のボタンクリックのような感触を提供したいと思います。
何を指示してるんですか?
happydudeの答えはこれを処理する最もエレガントな方法ですが、残念ながら(コメントで指摘されているように)ImageViewのソースコードは整数(単色)のみを受け入れます。 Issue 1822 はこの問題に対処するために数年前から存在しているので、ここに要約する回避策を投稿しました。
ImageViewを拡張し、drawableStateChanged()を新しい状態に基づいて色合いを設定するコードでラップします。
TintableImageView.Java
package com.example.widgets;
import Android.content.Context;
import Android.content.res.ColorStateList;
import Android.content.res.TypedArray;
import Android.util.AttributeSet;
import Android.support.v7.widget.AppCompatImageView;
import com.example.R;
public class TintableImageView extends AppCompatImageView {
private ColorStateList tint;
public TintableImageView(Context context) {
super(context);
}
public TintableImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public TintableImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TintableImageView, defStyle, 0);
tint = a.getColorStateList(R.styleable.TintableImageView_tintColorStateList);
a.recycle();
}
@Override
protected void drawableStateChanged() {
super.drawableStateChanged();
if (tint != null && tint.isStateful())
updateTintColor();
}
private void updateTintColor() {
int color = tint.getColorForState(getDrawableState(), 0);
setColorFilter(color);
}
}
カスタム属性を定義します。
attrs.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<declare-styleable name="TintableImageView">
<attr name="tintColorStateList" format="reference|color" />
</declare-styleable>
</resources>
Androidの代わりに、ローカル名前空間でウィジェットとカスタム属性を使用します。
example_layout.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="horizontal">
<com.example.widgets.TintableImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/example"
Android:clickable="true"
app:tintColorStateList="@color/color_selector"/>
</LinearLayout>
その後、happydudeが提案するようなカラーセレクターを使用できます。
color_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true" Android:color="@color/pressed_color"/>
<item Android:color="#00000000"/>
</selector>
1つの方法は、ボタンが押されたときの色合いの色を含むColorFilter
とColorStateList
の組み合わせを使用することです。 res/colorディレクトリのColorStateList
のxmlは次のようになります。
button_pressed.xml
_<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true" Android:color="@color/pressed_color"/>
<item Android:color="#00000000"/>
</selector>
_
ここで_@color/pressed_color
_は色合いの色です(部分的に透明である必要があります)。次に、ImageView
サブクラスで、drawableStateChanged()
をオーバーライドして色を適用します。
_@Override
protected void drawableStateChanged() {
super.drawableStateChanged();
ColorStateList list = getResources().getColorStateList(R.color.button_pressed);
int color = list.getColorForState(getDrawableState(), Color.TRANSPARENT);
setColorFilter(color);
invalidate();
}
_
ボタンの状態が変わるたびに、このコードが呼び出され、必要に応じて自動的に色合いが設定されます。
私にとって簡単な解決策は、setAlpha(180) in onClickイベントを使用して動作することです。クリックまたはタッチされたというフィードバックをユーザーに提供します。
final ImageView myImage = (ImageView) findViewById(R.id.ivDocument);
myImage.setImage...(... your image ...); // load your ImageView
myImage.setClickable(true);
myImage.setFocusable(true);
myImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
myImage.setAlpha(180);
doWhateverYouWantHere(v);
}
});
XMLレイアウトに関して、特別なことはありません。
私はそれをテストする必要がありますが、ImageViewのドローアブルとしてその動作を使用してxmlを設定し、ImageViewの背景としてビットマップを設定できるはずです。