Android通过手势实现的缩放处理

     主要原理是onTouchEvent事件中的参数MotionEvent,它有一个getSize()方法。在一个点的时候,该方法永远返回0,而在两个触电的时候,该方法则根据两点相对位置变化而返回不同的值。我们只需计算出两点之间的距离变化,距离的大小表明我们希望目标变化的趋势。而getX()和getY()方法则永远座落在两触点之间,这样趋势和目标我们都有了。剩下的就是对目标根据趋势进行放大或缩小即可。 下边是根据我前边描述的思路编写的代码:让一个蓝色的圆根据手势放大或者缩小。流感中,代码就不指望太清晰了

 

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