android手指缩放效果【转】

写这篇文章,是因为试了这篇《Android通过手势实现的缩放处理》http://www.oschina.net/code/snippet_16_2735 介绍的缩放代码在(G11 android2.3.3)上运行,完成没有缩放效果,只有一个蓝色的圆,跟着手指移动。。。。只好自己看下 android自带的demo和API,自己实现下缩放效果。
MotionEvent类中有个方法getActionMasked(),这个方法可以检查触摸的状态:
当只有一个触摸点时(只用一根手指触摸屏幕),按下是0,起来是1,移动是2;
当触摸点多于1时(多根手指触摸屏幕),按下是5,起来是6,移动是2;
可以使用MotionEvent的getPointerCount()方法检查当前屏幕有多少个触摸点。
实现代码在《Android通过手势实现的缩放处理》的基础上做了点修改。

import  android.app.Activity;
import  android.content.Context;
import  android.graphics.Canvas;
import  android.graphics.Color;
import  android.graphics.Paint;
import  android.os.Bundle;
import  android.view.MotionEvent;
import  android.view.View;

public   class  MultiTouchTestActivity  extends  Activity {
    @Override
    
public   void  onCreate(Bundle savedInstanceState) {
        
super .onCreate(savedInstanceState);
        View view 
=   new  MultiTouchView( this );

        setContentView(view);

    }

    
class  MultiTouchView  extends  View {
        
private   float  x1;
        
private   float  y1;
        
private   float  x2;
        
private   float  y2;

        
private   float  r  =  30F;
        
private   float  r1  =  0F;
        
private   float  r2  =  0F;
        
private   int  max  =   0 ;
        
public  MultiTouchView(Context context) {
            
super (context);
        }

        @Override
        
public   boolean  onTouchEvent(MotionEvent event) {
            
int  action  =  event.getActionMasked();
            
int  p  =  event.getPointerCount(); // 接触点数
             int  N  =  event.getHistorySize();
            
if (N  >  max){
                max 
=  N;
            }
           
            String sff 
=   "   " ;
            
// 只处理两点触摸
             if (p  ==   2   &&  action  ==  MotionEvent.ACTION_POINTER_1_DOWN){
                x1 
=  event.getX( 0 );
                y1 
=  event.getY( 0 );
                x2 
=  event.getX( 1 );
                y2 
=  event.getY( 1 );
                
            }
            
// 只处理两点触摸
             if (p  ==   2   &&  action  ==  MotionEvent.ACTION_MOVE){
                r1 
=  ( float ) Math.sqrt((x1  -  x2)  *  (x1  -  x2)  +  (y1  -  y2)
                        
*  (y1  -  y2))  /   2 ;
                
float  tx1  =  event.getX( 0 );
                
float  ty1  =  event.getY( 0 );
                
float  tx2  =  event.getX( 1 );
                
float  ty2  =  event.getY( 1 );
                r2 
=  ( float ) Math.sqrt((tx1  -  tx2)  *  (tx1  -  tx2)  +  (ty1  -  ty2)
                        
*  (ty1  -  ty2))  /   2 ;
            }
            
if (p  ==   2   &&  action  ==  MotionEvent.ACTION_POINTER_1_UP){
                r 
=  r  +  (r2  -  r1);
            }
            
if (p  ==   1 ){
                x1 
=  event.getX( 0 );
                y1 
=  event.getY( 0 );
            }
            
for  ( int  j  =   0 ; j  <  p; j ++ ) {
                
int  x  =  ( int )event.getX(j);
                
int  y  =  ( int )event.getY(j);
                sff 
=  sff  +   " ( "   +  x  +   " , "   +  y  +   " " ;
            }

            MultiTouchTestActivity.
this .setTitle(String.valueOf(action  +   "   "   +  p  +   "  r: "   +  ( int )r)  +   "  r1: "   +  

(
int )r1  +   "  r2: "   +  ( int )r2);
            invalidate();
            
return   true ;

        }

        @Override
        
protected   void  onDraw(Canvas canvas) {
            
super .onDraw(canvas);
            Paint paint 
=   new  Paint();
            paint.setColor(Color.BLUE);
            canvas.drawCircle(x1, y1, r 
+  r2  -  r1, paint);
        }
    }
}
在AVD(android2.3.3)中运行效果
http://www.blogjava.net/pengo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值