0

私の Android アプリには、一連の画像を表示する GridView があり、それぞれが ImageView (TickedImageView) のカスタム サブクラスにあり、画像が選択されたときに目盛りが表示されます。私が達成したいのは、画像に触れたときに波紋を表示することです。背景を設定してみました

?android:attr/selectableItemBackground

運が悪かったので、この背景でラッパーレイアウトも追加しましたが、何も機能していないようです.

私のコードは次のとおりです。

<GridView
    android:id="@+id/photos_grid"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:horizontalSpacing="2dp"
    android:numColumns="@integer/photos_grid_num_columns"
    android:stretchMode="columnWidth"
    android:verticalSpacing="2dp"
    android:layout_below="@id/spinner_toolbar" />

各 GridView アイテムのレイアウトは次のとおりです。

<utils.TickedImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/thumb"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:attr/selectableItemBackground"
    android:focusable="true"
    android:clickable="true" />

ImageView サブクラス (TickedImageView) は次のとおりです。

package utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import app.R;

public class TickedImageView extends ImageView {

    private boolean selected;
    private Bitmap mTickBmp;
    private Paint mDarkerPaint;
    private View.OnClickListener onImageClickListener;
    private int x, y;

    public TickedImageView(Context context) {
       super(context);
       init();
    }

    public TickedImageView(Context context, AttributeSet attrs) {
       super(context, attrs);
       init();
    }

    private void init() {
       super.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               setSelected(!isSelected());

               if (onImageClickListener != null)
                  onImageClickListener.onClick(TickedImageView.this);
           }
        });

        mDarkerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mDarkerPaint.setStyle(Paint.Style.FILL);
        mDarkerPaint.setColor(0x80142030);

        mTickBmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_done_white_48px);
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
        invalidate();
    }

    public boolean isSelected() {
        return selected;
    }

    @Override
    protected void onDraw(@NonNull Canvas canvas) {
        super.onDraw(canvas);

        if (selected) {
            canvas.drawRect(0, 0, canvas.getWidth(), getMeasuredWidth(), mDarkerPaint);
            canvas.drawBitmap(mTickBmp, x, y, null);
        }
    }

    @Override
    public void setOnClickListener(OnClickListener listener) {
        onImageClickListener = listener;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);

        x = (getMeasuredWidth() / 2) - (mTickBmp.getWidth() / 2);
        y = (getMeasuredWidth() / 2) - (mTickBmp.getHeight() / 2);
    }
}

ありがとうございました。

4

1 に答える 1