Android 非常不错的倾斜图片组合效果

  • 先看效果动图

screenVideo.gif
  • 上面动图比较糊,可以看下面的部分截图

image.png

image.png
  • 主要是采用canvas的clipPath实现,不是很复杂,主要动态计算哈坐标就行,工程不大,就直接贴代码了,如下:
class MainActivity : AppCompatActivity() {
    private val PREFS_FILE = "device_id.xml"
    private val PREFS_DEVICE_ID = "device_id"
    private var uuid: UUID? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById(R.id.onePicBtn).setOnClickListener {
            findViewById(R.id.testImgV).setImageBitmap(Utils.compoundBitmap(this, true, 300, true, 200, findViewById(R.id.isArcFg).isChecked,
                Color.WHITE, arrayListOf(BitmapFactory.decodeResource(resources, R.drawable.image_1))))
        }

        findViewById(R.id.twoPicBtn).setOnClickListener {
            findViewById(R.id.testImgV).setImageBitmap(Utils.compoundBitmap(this, true, 300, true, 200, findViewById(R.id.isArcFg).isChecked,
                Color.WHITE, arrayListOf(BitmapFactory.decodeResource(resources, R.drawable.image_1), BitmapFactory.decodeResource(resources, R.drawable.image_2))))
        }

        findViewById(R.id.threePicBtn).setOnClickListener {
            findViewById(R.id.testImgV).setImageBitmap(Utils.compoundBitmap(this, true, 300, true, 200, findViewById(R.id.isArcFg).isChecked,
                Color.WHITE, arrayListOf(BitmapFactory.decodeResource(resources, R.drawable.image_1), BitmapFactory.decodeResource(resources, R.drawable.image_2),
                    BitmapFactory.decodeResource(resources, R.drawable.image_3))))
        }
    }
}



    
package com.stephen.mytestapplication;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.BitmapDrawable;

import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Enumeration;
import java.util.List;

public class Utils {
    public static int dp2px(float dp, Context mContext) {
        final float scale = mContext.getResources().getDisplayMetrics().density;
        return (int) (dp * scale + 0.5f);
    }

    //拼装图片
    public static Bitmap compoundBitmap(Context context, boolean isWidthDp, int showWidthVal, boolean isHeightDp,
                                        int showHeightVal, boolean isArcFg, int bgColorVal, List bitmaps) {
        int imageWidth = isWidthDp ? dp2px(showWidthVal, context) : showWidthVal;
        int imageHeight = isHeightDp ? dp2px(showHeightVal, context) : showHeightVal;
        Bitmap compoundBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
        if(null != bitmaps && bitmaps.size() > 0){
            Paint paint = new Paint();
            paint.setDither(true);
            paint.setAntiAlias(true);
            paint.setStrokeWidth(5);
            paint.setStyle(Paint.Style.FILL);

            Canvas mCanvas = new Canvas(compoundBitmap);
            int lineSpacingW;
            Path path1, path2, path3;
            Matrix matrix1, matrix2;
            switch(bitmaps.size()){
                case 1:
                    mCanvas.drawBitmap(resizeBitmap(bitmaps.get(0), imageWidth, imageHeight), 0, 0,null);
                    break;
                case 2:
                    paint.setColor(bgColorVal);
                    mCanvas.drawRect(0,0, imageWidth, imageHeight, paint);
                    paint.setStyle(Paint.Style.STROKE);
                    paint.setColor(Color.RED);

                    int halfDistanceW = (int)((float)imageWidth/2f);//宽度上分成几份后的单份宽度
                    int angleSpacingW = dp2px(40f, context);//多余的角宽度
                    lineSpacingW = dp2px(6f, context);//正常间距的一半

                    mCanvas.save();
                    path1 = new Path();
                    path1.moveTo(0, 0);
                    path1.lineTo(halfDistanceW + angleSpacingW, 0);
                    path1.lineTo(halfDistanceW - angleSpacingW - lineSpacingW, imageHeight);
                    path1.lineTo(0, imageHeight);
                    path1.close();
                    mCanvas.clipPath(path1);
                    //mCanvas.drawPath(path1, paint);
                    matrix1 = new Matrix();
                    matrix1.setTranslate(-(halfDistanceW/2f), 0);
                    mCanvas.drawBitmap(resizeBitmap(bitmaps.get(0), imageWidth, imageHeight), matrix1, null);
                    mCanvas.restore();

                    mCanvas.save();
                    path2 = new Path();
                    path2.moveTo(imageWidth, 0);
                    path2.lineTo(imageWidth, imageHeight);
                    path2.lineTo(halfDistanceW - angleSpacingW, imageHeight);
                    path2.lineTo(halfDistanceW + angleSpacingW + lineSpacingW, 0);
                    path2.close();
                    mCanvas.clipPath(path2);
                    //mCanvas.drawPath(path2, paint);
                    matrix2 = new Matrix();
                    matrix2.setTranslate((halfDistanceW/2f), 0);
                    mCanvas.drawBitmap(resizeBitmap(bitmaps.get(1), imageWidth, imageHeight), matrix2,null);
                    mCanvas.restore();
                    break;
                default:
                    paint.setColor(bgColorVal);
                    mCanvas.drawRect(0,0, imageWidth, imageHeight, paint);
                    paint.setStyle(Paint.Style.STROKE);
                    paint.setColor(Color.RED);

                    int onceDistanceW = (int)((float)imageWidth/5f);//宽度上分成几份后的单份宽度
                    lineSpacingW = dp2px(5, context);

                    mCanvas.save();
                    path1 = new Path();
                    path1.moveTo(0, 0);
                    path1.lineTo((2 * onceDistanceW) - lineSpacingW, 0);
                    path1.lineTo(onceDistanceW - lineSpacingW, imageHeight);
                    path1.lineTo(0, imageHeight);
                    path1.close();
                    mCanvas.clipPath(path1);
                    //mCanvas.drawPath(path1, paint);
                    matrix1 = new Matrix();
                    matrix1.setTranslate(-(2.5f * onceDistanceW), 0);
                    mCanvas.drawBitmap(resizeBitmap(bitmaps.get(0), imageWidth, imageHeight), matrix1, null);
                    mCanvas.restore();

                    mCanvas.save();
                    path2 = new Path();
                    path2.moveTo(2 * onceDistanceW, 0);
                    path2.lineTo((4 * onceDistanceW) + lineSpacingW, 0);
                    path2.lineTo((3 * onceDistanceW) + lineSpacingW, imageHeight);
                    path2.lineTo(onceDistanceW, imageHeight);
                    path2.close();
                    mCanvas.clipPath(path2);
                    //mCanvas.drawPath(path2, paint);
                    mCanvas.drawBitmap(resizeBitmap(bitmaps.get(1), imageWidth, imageHeight), 0, 0,null);
                    mCanvas.restore();

                    mCanvas.save();
                    path3 = new Path();
                    path3.moveTo(imageWidth, 0);
                    path3.lineTo(imageWidth, imageHeight);
                    path3.lineTo((3 * onceDistanceW) + (2 * lineSpacingW), imageHeight);
                    path3.lineTo((4 * onceDistanceW) + (2 * lineSpacingW), 0);
                    path3.close();
                    mCanvas.clipPath(path3);
                    //mCanvas.drawPath(path3, paint);
                    matrix2 = new Matrix();
                    matrix2.setTranslate((2.5f * onceDistanceW), 0);
                    mCanvas.drawBitmap(resizeBitmap(bitmaps.get(2), imageWidth, imageHeight), matrix2,null);
                    mCanvas.restore();
                    break;
            }
            return isArcFg ? compoundBitmapArcFg(context, false, imageWidth, false, imageHeight, compoundBitmap) : compoundBitmap;
        }//end of if
        return null;
    }

    //拼装图片-圆弧前景
    public static Bitmap compoundBitmapArcFg(Context context, boolean isWidthDp, int showWidthVal, boolean isHeightDp,
                                             int showHeightVal, Bitmap bitmap) {
        int imageWidth = isWidthDp ? dp2px(showWidthVal, context) : showWidthVal;
        int imageHeight = isHeightDp ? dp2px(showHeightVal, context) : showHeightVal;
        Bitmap compoundBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
        Canvas mCanvas = new Canvas(compoundBitmap);
        /*Paint paint = new Paint();
        paint.setDither(true);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.FILL);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.RED);*/
        mCanvas.save();
        Path pathFg = new Path();
        pathFg.addCircle((float)imageWidth/2f, -((float)imageHeight/3f), (float)imageHeight + ((float)imageHeight/5f), Path.Direction.CW);
        mCanvas.clipPath(pathFg);
        //mCanvas.drawPath(pathFg, paint);
        mCanvas.drawBitmap(bitmap, 0, 0,null);
        mCanvas.restore();
        return compoundBitmap;
    }

    //压缩图片
    public static Bitmap resizeBitmap(Bitmap bitmap, int newWidth, int newHeight) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        float curRatio = Math.max(scaleWidth, scaleHeight);
        Matrix matrix = new Matrix();
        matrix.postScale(curRatio, curRatio);
        return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
    }
}
  • 附网上参考一个老哥效果比较接近的地址:https://www.jb51.net/article/86090.htm

你可能感兴趣的:(Android 非常不错的倾斜图片组合效果)