您的位置:首页 > 移动开发 > Android开发

Android之图像处理drawBitmapMesh

2016-12-22 16:25 471 查看
以前的账号不用了,现在是新账号的第一篇,从此就认定这个啦!!
最近了解了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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android