Android之图像处理drawBitmapMesh

以前的账号不用了,现在是新账号的第一篇,从此就认定这个啦!!
最近了解了android中的drawBitmapMesh这个方法,利用这个方法写了一个旗帜飘动的效果。 先了解一下drawBitmapMesh()方法及参数

drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts,int vertOffset, int[] colors, int colorOffset, Paint paint)
参数依次是:
bitmap:需要扭曲的原位图。
meshWidth:该参数控制在横向上把该源位图划分成多少格。
meshHeight:该参数控制在纵向上把该源位图划分为多少格。
verts:该参数是一个长度为(meshWidth+1)*(meshHeight+1)*2的数组,它记录了扭曲后的位图各顶点(网格线交点,我们记为“坐标点”)的位置。虽然verts是个一维数组,但是它记录的数据是形如坐标点的形式(x0, y0),(x1, y1),(x2, y2)……(xN, yN),这些数组元素控制对bitmap位图的扭曲效果.
vertOffset:控制verts数组从第几个数组元素开始对bitmap进行扭曲(忽略verOffset之前数据的扭曲效果)。
colors: 值一般为null。指定每个顶点的颜色,其记录改变像素点后的位图的颜色。若不为null,长度是一个meshWidth + 1)*(meshHeight + 1)+ colorOffset值。
colorOffset:控制colors数组从第几个数组元素开始对bitmap颜色进行改变
paint:可为null,用于绘制bitmap位图。

啥也不说了,上代码

public class MeshView extends View {

    private int WIDTH = 200;
    private int HEIGHT = 200;
    private int COUNT = (WIDTH + 1) * (HEIGHT + 1);
    private float[] verts = new float[COUNT * 2];
    private float[] orig = new float[COUNT * 2];
    private Bitmap mBitmap;
    private float K = 1;

    public MeshView(Context context) {
        super(context);
        initView();
    }

    public MeshView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    public MeshView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
    }

    private void initView() {
        // 对mesh view 进行分割
        int index = 0;
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        float bmWidth = mBitmap.getWidth();
        float bmHeight = mBitmap.getHeight();

        // 获取坐标点  二维循环遍历每个坐标点
        for (int i = 0; i < HEIGHT + 1; i++) {
            // y轴坐标为 图像的高度* i在整个网格中所占的比例
            float fy = bmHeight * i / HEIGHT;
            // 内循环遍历宽度
            for (int j = 0; j < WIDTH + 1; j++) {
                // x坐标为 图像的宽度 * 在网格宽度中所占的比例
                float fx = bmWidth * j / WIDTH;
                /*
                  index控制每个点的递增 
                  每两个点中第一个值为x坐标 ,fx
                  每两个点中第二个值为y坐标  fy  orig[index * 2 + 1] = verts[index * 2 + 1] = fy
                  orig[index * 2 + 1] = verts[index * 2 + 1] = fy+200;加200的原因是让图像往下移动200个像素

                */
                orig[index * 2 + 0] = verts[index * 2 + 0] = fx;
                orig[index * 2 + 1] = verts[index * 2 + 1] = fy + 200;
                index += 1;
            }
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 让坐标值进行发生改变  实现旗帜飘动效果 x坐标保持不变 y坐标呈现正弦曲线变动
        // 获取改变后的坐标点
        for (int i = 0; i < HEIGHT + 1; i++) {
            for (int j = 0; j < WIDTH + 1; j++) {
                // x坐标保持不变
                verts[(i * (WIDTH + 1) + j) * 2 + 0] += 0;
                /*
                  y坐标呈现正弦变换曲线,偏移量为offsetY  加k 是让图像动起来 让图像在水平方向上进行平移
                */
                float offsetY = (float) Math.sin((float) j / WIDTH * 2 * Math.PI + K * 2 * Math.PI);
                //offsetY * 50;  改变y的坐标 通过数组verts[], verts[]的改变是在orig[] 的基础上 +  offsetY*50  50是正弦函数的振幅
                verts[(i * (WIDTH + 1) + j) * 2 + 1] =
                        orig[(i * (WIDTH + 1) + j) * 2 + 1] + offsetY * 50;
            }
        }
        K += 0.1F;
        // verts改变后的坐标位置  colors 为null  colors 是通过colors数组改变像素点的颜色
        canvas.drawBitmapMesh(mBitmap, WIDTH, HEIGHT,
                verts, 0, null, 0, null);
        invalidate();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值