drawBitmapMesh扭曲图片

来源:互联网 发布:中国网络美女排行榜 编辑:程序博客网 时间:2024/04/30 03:54
class GameView extends View{        Bitmap bitmap;        final int WEIGHT_COUNT = 20; //宽度拆分数量        final int HEIGHT_COUNT = 20; //高度拆分数量        float[] verts; //扭曲后坐标        float [] olds; //扭曲前坐标        float K = 500000; //扭曲度,该值越大,扭曲的越严重        public GameView(Context context) {            super(context);            //显示的图片            bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.d)).getBitmap();            int bitWeight = bitmap.getWidth();            int bitHeight = bitmap.getHeight();            //计算分隔出的坐标点数量            int count = (WEIGHT_COUNT + 1)*(HEIGHT_COUNT +1)*2;            verts = new float[count];            olds = new float[count];            //计算分隔出的坐标位置            int index = 0; //数组位置            for(int x=0; x<WEIGHT_COUNT; ++x){ //横向坐标                float fx = bitWeight * x /WEIGHT_COUNT;                for(int y=0; y<HEIGHT_COUNT; ++y){ //纵向坐标                    float fy = bitHeight *y/HEIGHT_COUNT;                    verts[index] = olds[index] = fx;                    verts[index + 1] = olds[index + 1] = fy;                    index += 2;                }            }        }        protected void onDraw(Canvas canvas) {            super.onDraw(canvas);            //画背景            canvas.drawColor(Color.WHITE);            //画图像            canvas.drawBitmapMesh(bitmap,WEIGHT_COUNT,HEIGHT_COUNT,verts,0,null,0,null);        }        public boolean onTouchEvent(MotionEvent event) {            float x = event.getX();            float y = event.getY();            for(int i=0; i<olds.length; i+=2){                float oldX = olds[i];                float oldY = olds[i +1];                //得到点到按下地方的距离 (长的平方+宽的平方)开根号                float dx = x-oldX;                float dy = y - oldY;                float dd = dx*dx + dy*dy;                float length = (float)Math.sqrt(dd);                //计算扭曲度                float pull = K /(length*dd); //k值除以距离的3次方                if(pull >= 1){ //超过最大扭曲度,将坐标移动到按下的点                    verts[i] = x;                    verts[i+1] = y;                }else{                    verts[i] = oldX + dx * pull;                    verts[i + 1] = oldY + dy*pull;                }            }            invalidate();            return true;        }    }


0 0
原创粉丝点击