Android实现可以揉动的图片

public class Demo01 extends Activity{
	private Bitmap bitmap = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(new MyView(this, R.drawable.background));
	}
	
	private class MyView extends View{
		private final int  WIDTH = 20;
		private final int  HEIGHT = 20;
		private final int COUNT = (WIDTH+1)*(HEIGHT+1);
		private final float[] verts = new float[COUNT*2];
		private final float[]  orgs = new float[COUNT*2];
		public MyView(Context context,int drawableId) {
			super(context);
			setFocusable(true);
			bitmap = BitmapFactory.decodeResource(getResources(), drawableId);
			float bitmapWidth = bitmap.getWidth();
			float bitmapHeight = bitmap.getHeight();
			int index = 0;
			for(int y=0;y<=HEIGHT;y++){
				float fy = bitmapHeight / WIDTH * y;
				for(int x = 0;x<=WIDTH;x++){
					float fx = bitmapWidth / HEIGHT * x;
					verts[index*2 + 0 ] = orgs[index*2 + 0] = fx;
					verts[index*2 + 1 ] = orgs[index*2 + 1] = fy;
					index ++;
				}
			}
			setBackgroundColor(Color.WHITE);
		}
		
		@Override
		protected void onDraw(Canvas canvas) {
			super.onDraw(canvas);
			canvas.drawBitmapMesh(bitmap, WIDTH, HEIGHT, verts, 0, null, 0, null);
		}
		
		private void warp(float fx , float fy){
			for(int i=0;i<COUNT*2;i+=2){
				float dx = fx - orgs[i+0];
				float dy = fy - orgs[i+1];
				float dd = dx*dx + dy*dy;
				float d = (float) Math.sqrt(dd);
				float pull = 80000 / (float)(dd*d);
				if(pull > 1){
					verts[i+0] = fx;
					verts[i+1] = fy;
				}else{
					verts[i+0] = orgs[i+0] + dx*pull;
					verts[i+1] = orgs[i+1] + dy*pull;
				}
			}
			invalidate();
		}
		
		@Override
		public boolean onTouchEvent(MotionEvent event) {
			warp(event.getX(),event.getY());
			return true;
		}
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值