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 图片特效处理:drawBitmapMesh——图像扭曲+动感
- Android图像处理(五)镜像、倒影、drawBitmapMesh实现旗帜飘扬效果
- Android Canvas的drawBitmapMesh实现扭曲图像
- 初学Android,图形图像之使用drawBitmapMesh扭曲图像(三十二)
- Android图像处理之Bitmap类
- Android图形图像处理之Bitmap和BitmapFactory
- Android L(5.0)源码之图形与图像处理之简单图片——Bitmap
- 第52章、Bitmap图像处理(从零开始学Android)
- understanding drawBitmapMesh on android
- android中Bitmap图像处理 修改图片大小以及保存时的文件大小
- Android学习之——图形图像处理(Bitmap、BitmapFactory)(一)
- Android ,Bitmap ,Drawable,图像缩放,圆角处理,倒影
- Android图像处理之BitMap(2)
- Android学习之——图形图像处理(Bitmap、BitmapFactory)(一)
- android drawBitmapMesh and drawVertices
- (android图像处理)android之bitmap各种常用函数
- Android图像处理之Bitmap 生成图片 解析 保存文件 获取 问题
- Android图像处理之Bitmap类
- 【Android开发】图形图像处理技术-Bitmap和BitmapFactory类
- android中Bitmap图像处理 修改图片大小以及保存时的文件大小