android 图片操作之BitmapMesh
2016-01-03 14:11
513 查看
[code] /** * 通过 坐标矩阵的变换来操作图片 */ public class MeshView extends View { private static int WIDTH=200; private static int HEIGHT=200; //分割的焦点个数 private int COUNT=(WIDTH+1)*(HEIGHT+1); //保存原坐标 private float[] orig=new float[COUNT*2]; //原本的图片 private Bitmap origBitmap; public MeshView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public MeshView(Context context, AttributeSet attrs) { this(context, attrs,0); } public MeshView(Context context) { this(context,null); } public void init(){ origBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.test3); int width=origBitmap.getWidth(); int height=origBitmap.getHeight(); int index=0; for(int i=0;i<WIDTH+1;i++){ float fx=width*i/WIDTH; for(int j=0;j<HEIGHT+1;j++){ float fy=height*j/HEIGHT; //保存坐标的横坐标 orig[index*2+0]=fx; //保存坐标的纵坐标 orig[index*2+1]=fy; index++; } } } @Override protected void onDraw(Canvas canvas) { //获取变换后的数组 float[] verts=sinPixels(orig); //通过变换后的数组来操作图片 canvas.drawBitmapMesh(origBitmap, WIDTH, HEIGHT, verts,0,null, 0, null); } public float[] sinPixels(float[] orgs){ float[] verts=new float[COUNT*2]; //坐标变换 for(int i=0;i<WIDTH+1;i++){ for(int j=0;j<HEIGHT+1;j++){ //横坐标 verts[(i*(HEIGHT+1)+j)*2]=orgs[(i*(HEIGHT+1)+j)*2]; //纵坐标的偏移 float offy=(float) Math.sin((float)i/HEIGHT*2*Math.PI); //纵坐标 verts[(i*(HEIGHT+1)+j)*2+1]=offy*50+orgs[(i*(HEIGHT+1)+j)*2+1]; } } return verts; } }
相关文章推荐
- Gradle在Android Studio 的应用
- android 图片操作之Shader
- android 图片操作之Xfermode
- Android点击Button水波纹效果
- android图片操作之 Matrix
- Android常用数据库ORM框架ORMlite和GreenDao比较
- [置顶] Android 中触摸事件的分发和拦截
- Android Service学习之IntentService 深入分析
- Android图片上传的工具类
- Android HandlerThread 的使用及讲解
- Android ListView的简单实现
- Android线程问题及主线程与子线程的交互
- Android特效专辑(三)——自定义不一样的Toast
- Android特效专辑(三)——自定义不一样的Toast
- Android中SurfaceView的使用详解
- Android Handler removeMessages引发postDelayed失效的问题
- Android解析json
- Android特效专辑(二)——ViewPager渲染背景颜色渐变(引导页)
- Android特效专辑(二)——ViewPager渲染背景颜色渐变(引导页)
- Android菜单