2

ユーザーが画面に触れる場所に応じて、マスクを使用して画像の一部を非表示にしようとしています。そうするために、私はCyril Mottier によって提供されたコード サンプルに従いました。私が今まで行ったことは実際に機能します。ImageView の一部をクリックすると、上にあるものはすべて非表示になります。問題は、それが黒い色で隠されているため、ImageView の背後にあるものが表示されないことです。

誰かが私にヒントを提供したり、私が間違っていることを教えてくれませんか?

その時の画面がこちら

主な活動は次のとおりです。

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

    final MaskedImageView iv = (MaskedImageView) findViewById(R.id.picture_on);
    iv.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.d(MainActivity.class.getSimpleName(), "on touch called");

            Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
                    .getDefaultDisplay();
            Point point = new Point();
            display.getSize(point);

            Rect bounds = iv.getDrawable().getBounds();
            bounds.top = point.y
                    - (int) event.getY()
                    ;
            iv.setMask(bounds);
            iv.invalidate();
            return false;
        }
    });
}

そして、ここでカスタム ImageView :

public class MaskedImageView extends ImageView {

    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

    private Bitmap mMask;

    public MaskedImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        // Prepares the paint that will be used to draw our icon mask. Using
        // PorterDuff.Mode.DST_IN means the image that will be drawn will
        // mask the already drawn image.
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    }

    public MaskedImageView(Context context, AttributeSet attrs) {
        super(context, attrs);

        // Prepares the paint that will be used to draw our icon mask. Using
        // PorterDuff.Mode.DST_IN means the image that will be drawn will
        // mask the already drawn image.
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    }

    public MaskedImageView(Context context) {
        super(context);

        // Prepares the paint that will be used to draw our icon mask. Using
        // PorterDuff.Mode.DST_IN means the image that will be drawn will
        // mask the already drawn image.
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    }

    public void setMask(Rect rect) {
        mMask = Bitmap.createBitmap(Math.abs(rect.right - rect.left),
                Math.abs(rect.bottom - rect.top), Bitmap.Config.ALPHA_8);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();
        BitmapDrawable bd = (BitmapDrawable) getDrawable();
        canvas.drawBitmap(bd.getBitmap(), 0, 0, null);

        if (mMask != null) {
            canvas.drawBitmap(mMask, 0, 0, mPaint);
        }
        canvas.restore();
    }


}

回答ありがとうございます

4

0 に答える 0