web-dev-qa-db-ja.com

Androidボタンのクリックをシミュレートするための画像ビューの色合いの変更

URLから取得したビットマップを設定したイメージビューがあります。 imageviewで、ダイアログを開くonClickListenerを設定しました。

Imageviewが押されたときに色合いを何らかの方法で変更(暗くする)して、一種のボタンクリックのような感触を提供したいと思います。

何を指示してるんですか?

38
Abhishek

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>
99
Stephen Kidson

1つの方法は、ボタンが押されたときの色合いの色を含むColorFilterColorStateListの組み合わせを使用することです。 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();
}
_

ボタンの状態が変わるたびに、このコードが呼び出され、必要に応じて自動的に色合いが設定されます。

7
happydude

私にとって簡単な解決策は、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レイアウトに関して、特別なことはありません。

0
Jagoliveira

私はそれをテストする必要がありますが、ImageViewのドローアブルとしてその動作を使用してxmlを設定し、ImageViewの背景としてビットマップを設定できるはずです。

0
Charlie-Blake