主题:Android通过手势实现的缩放处理(转http://www.javaeye.com/topic/516876)

   发表时间:2009-11-14   最后修改:2009-11-18
原文《我认为HTC HERO-ROM支持所谓的多点触摸是个谎言》我觉得太具有攻击性,和我平时的风格不大相符,故撤换之。


看见网上很多人评论HTC的HERO是支持多点触摸的,我也心痒痒了很久。要知道,如果能找到绕过Google实现多点触摸的真理,那将会引起Android软件设计上的一场革命...

网络上传言HTC的HERO-ROM支持多点触摸的论证大多源于浏览网页和图片时,能像IPhone一样通过手势来控制页面的大小。但是我认为,就算不通过尚未公布的多点触摸(很怀疑HTC目前的电容屏是否只支持两点触摸而已,并不是多点。之前有看过一篇文章介绍电容屏的区别,如果我以后能找到一定贴上来,当然这是题外话了),我们一样能够利用现有的API实现HERO浏览图片和网页的缩放功能。

主要原理是onTouchEvent事件中的参数MotionEvent,它有一个getSize()方法。在一个点的时候,该方法永远返回0,而在两个触电的时候,该方法则根据两点相对位置变化而返回不同的值。我们只需计算出两点之间的距离变化,距离的大小表明我们希望目标变化的趋势。而getX()和getY()方法则永远座落在两触点之间,这样趋势和目标我们都有了。剩下的就是对目标根据趋势进行放大或缩小即可。

下边是根据我前边描述的思路编写的代码:让一个蓝色的圆根据手势放大或者缩小。流感中,代码就不指望太清晰了。

Java代码 复制代码
  1. /**  
  2.  * ...  
  3.  *   
  4.  * @author vlinux  
  5.  *   
  6.  */  
  7. public class MultiTouchTestActivity extends Activity {   
  8.     /** Called when the activity is first created. */  
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {   
  11.         super.onCreate(savedInstanceState);   
  12.         // setContentView(R.layout.main);   
  13.         View view = new MultiTouchView(this);   
  14.         setContentView(view);   
  15.     }   
  16.   
  17.     class MultiTouchView extends View {   
  18.   
  19.         private float x1;   
  20.         private float y1;   
  21.         private float x2;   
  22.         private float y2;   
  23.   
  24.         public MultiTouchView(Context context) {   
  25.             super(context);   
  26.             // TODO Auto-generated constructor stub   
  27.         }   
  28.   
  29.         @Override  
  30.         public boolean onTouchEvent(MotionEvent event) {   
  31.             // TODO Auto-generated method stub   
  32.   
  33.             float size = event.getSize();   
  34.   
  35.             int szi = (int) size;   
  36.             int dxi = szi >> 12;   
  37.             int dyit = ((1 << 12) - 1);   
  38.             int dyi = szi & dyit;   
  39.   
  40.             DisplayMetrics metrics = getResources().getDisplayMetrics();   
  41.             float dx = metrics.widthPixels * dxi / (float) dyit;   
  42.             float dy = metrics.heightPixels * dyi / (float) dyit;   
  43.   
  44.             x1 = event.getX();   
  45.             y1 = event.getY();   
  46.   
  47.             x2 = x1 + dx;   
  48.             y2 = y1 + dy;   
  49.   
  50.             invalidate();   
  51.   
  52.             return true;   
  53.         }   
  54.   
  55.         @Override  
  56.         protected void onDraw(Canvas canvas) {   
  57.             // TODO Auto-generated method stub   
  58.             super.onDraw(canvas);   
  59.   
  60.             float r = (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2)   
  61.                     * (y1 - y2)) / 2;   
  62.             r = 50 >= r ? 50 : r;   
  63.   
  64.             Paint paint = new Paint();   
  65.             paint.setColor(Color.BLUE);   
  66.             canvas.drawCircle(x1, y1, r, paint);   
  67.   
  68.         }   
  69.   
  70.     }   
  71.   
  72. }  
/**
 * ...
 * 
 * @author vlinux
 * 
 */
public class MultiTouchTestActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// setContentView(R.layout.main);
		View view = new MultiTouchView(this);
		setContentView(view);
	}

	class MultiTouchView extends View {

		private float x1;
		private float y1;
		private float x2;
		private float y2;

		public MultiTouchView(Context context) {
			super(context);
			// TODO Auto-generated constructor stub
		}

		@Override
		public boolean onTouchEvent(MotionEvent event) {
			// TODO Auto-generated method stub

			float size = event.getSize();

			int szi = (int) size;
			int dxi = szi >> 12;
			int dyit = ((1 << 12) - 1);
			int dyi = szi & dyit;

			DisplayMetrics metrics = getResources().getDisplayMetrics();
			float dx = metrics.widthPixels * dxi / (float) dyit;
			float dy = metrics.heightPixels * dyi / (float) dyit;

			x1 = event.getX();
			y1 = event.getY();

			x2 = x1 + dx;
			y2 = y1 + dy;

			invalidate();

			return true;
		}

		@Override
		protected void onDraw(Canvas canvas) {
			// TODO Auto-generated method stub
			super.onDraw(canvas);

			float r = (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2)
					* (y1 - y2)) / 2;
			r = 50 >= r ? 50 : r;

			Paint paint = new Paint();
			paint.setColor(Color.BLUE);
			canvas.drawCircle(x1, y1, r, paint);

		}

	}

}


以上是我对HERO-ROM如何实现类似IPHONE一样缩放图片、网页的方法。时间仓促,若有不对,欢迎指出。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值