1

图 2

图 1

结果

我有两个图像。图 1 很大,只有一些颜色。图 2 有黑色的矢量数字,背景透明。我正在尝试使用 Image 1 颜色为 Image 2 字母着色。我尝试使用 .svg 然后转换为位图。

我尝试过创建自己的 CustomImage(它会覆盖 View)。我还重写了 OnDraw,绘制位图并使用 PorterDuffXerMode 实时创建蒙版。

我希望得到彩色的七人制,而右侧没有黑色背景或图像的其余部分。

这是图像 1 ---> https://i.stack.imgur.com/ha1lN.png

这是图像 2---> https://i.stack.imgur.com/HQrme.png

结果---> https://i.stack.imgur.com/atJYF.jpg

<vector android:height="93dp" android:viewportHeight="93"
    android:viewportWidth="318.97" android:width="319dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#010101" android:pathData="M0,0l0.7,11.51l41.97,0l-38.08,67.92l9.59,6.19l49.54,-85.62l-63.72,0l63.72,0"/>
    <path android:fillColor="#010101" android:pathData="M255.25,0l0.71,11.51l41.96,0l-38.08,67.92l9.59,6.19l49.54,-85.62l-63.72,0l63.72,0"/>
    <path android:fillColor="#010101" android:pathData="M191.32,0l0.71,11.51l41.96,0l-38.08,67.92l9.59,6.19l49.55,-85.62l-63.73,0l63.73,0"/>
    <path android:fillColor="#010101" android:pathData="M127.6,0l0.71,11.51l41.96,0l-38.08,67.92l9.59,6.19l49.54,-85.62l-63.72,0l63.72,0"/>
    <path android:fillColor="#010101" android:pathData="M63.88,0l0.7,11.51l41.97,0l-38.08,67.92l9.59,6.19l49.54,-85.62l-63.72,0l63.72,0"/>
</vector>

<vector android:height="93dp" android:viewportHeight="93"
    android:viewportWidth="797.67" android:width="798dp"
    xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:pathData="M0.5,0.5h796.67v92h-796.67z"
        android:strokeColor="#000" android:strokeWidth="1">
        <aapt:attr name="android:fillColor">
            <gradient android:endX="797.17" android:endY="46.5"
                android:startX="0.5" android:startY="46.5" android:type="linear">
                <item android:color="#FFF6B046" android:offset="0"/>
                <item android:color="#FFF870F3" android:offset="0.16"/>
                <item android:color="#FF00D2FE" android:offset="0.37"/>
                <item android:color="#FF00E3CD" android:offset="0.55"/>
                <item android:color="#FFF871F0" android:offset="0.79"/>
                <item android:color="#FFF784BD" android:offset="0.86"/>
                <item android:color="#FFF6AD4E" android:offset="1"/>
            </gradient>
        </aapt:attr>
    </path>
</vector>

Vectors data:

    private Bitmap mImage;
    private Bitmap mMask;
    private int posX=0;
    private int posY=0;

    private Paint maskPaint;
    private Paint imagePaint;

    public CustomImage(Context context, AttributeSet attrs) {
        super(context, attrs);
        maskPaint  = new Paint();
        maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

        imagePaint = new Paint();
        imagePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
    }

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

        mImage = getBitmap(getContext(), R.drawable.colors2);
        mMask = getBitmap(getContext(), R.drawable.ic_black_seven);

        setLayerType(LAYER_TYPE_HARDWARE, maskPaint);
        setLayerType(LAYER_TYPE_HARDWARE, imagePaint);
        canvas.drawBitmap(mImage, posX, posY, imagePaint);
        canvas.drawBitmap(mMask, 0, 0, maskPaint);
        canvas.restore();
    }

    private static Bitmap getBitmap(VectorDrawable vectorDrawable) {
        Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        vectorDrawable.draw(canvas);
        return bitmap;
    }

    private static Bitmap getBitmap(Context context, int drawableId) {
        Drawable drawable = ContextCompat.getDrawable(context, drawableId);
        if (drawable instanceof BitmapDrawable) {
            return BitmapFactory.decodeResource(context.getResources(), drawableId);
        } else if (drawable instanceof VectorDrawable) {
            return getBitmap((VectorDrawable) drawable);
        } else {
            throw new IllegalArgumentException("unsupported drawable type");
        }
    }
}```



4

0 回答 0