`
fokman
  • 浏览: 238820 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

android 基于surfaceview 的多点触控实现

 
阅读更多

       hello,各位朋友。最近接到一个功能需要实现多点触控,也就是我们通常所看到的把手指放在屏幕上,可以放大和缩小图片的 操作。在google上查找了一些资料,发现很多都是使用imageView在实现的。但是在游戏的开发过程中,使用surfaceview效率会更高一些,所以就尝试使用surfaceview来实现。

看代码:

public class DisplayActivity extends Activity {
	private SurfaceView videoView;
	private SurfaceHolder sfh;
	private Canvas canvas;
	private Paint paint;
	private boolean flag = true;
	private int screenW, screenH;
	private Bitmap bmpIcon;
	//记录两个触屏点的坐标
	private int x1, x2, y1, y2;
	//倍率
	private float rate = 1;
	//记录上次的�?�?
	private float oldRate = 1;
	//记录第一次触屏时线段的长�?
	private float oldLineDistance;
	//判定是否头次多指触点屏幕
	private boolean isFirst = true;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.media_play);
		videoView = (SurfaceView)findViewById(R.id.videoView);
		sfh = videoView.getHolder();
		sfh.addCallback(new DisplaySurfaceView());
		DisplayMetrics dm = new DisplayMetrics(); 
		getWindowManager().getDefaultDisplay().getMetrics(dm); 
		screenW = dm.widthPixels; 
		screenH = (dm.heightPixels)/2;

	}

	class DisplaySurfaceView implements SurfaceHolder.Callback{
		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
			
		}

		@Override
		public void surfaceCreated(SurfaceHolder arg0) {
			new ImageThread().start();
		}

		@Override
		public void surfaceDestroyed(SurfaceHolder arg0) {
			flag = false;
		}
		
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_UP) {
			isFirst = true;
			oldRate = rate;
		} else {
			if (event.getPointerCount() > 1) { 
				x1 = (int) event.getX(0);
				y1 = (int) event.getY(0);
				x2 = (int) event.getX(1);
				y2 = (int) event.getY(1);
				if (event.getPointerCount() == 2) {
					if (isFirst) {
						//得到第一次触屏时线段的长�?
						oldLineDistance = (float) Math.sqrt(Math.pow(event.getX(1) - event.getX(0), 2) + Math.pow(event.getY(1) - event.getY(0), 2));
						isFirst = false;
					} else {
						//得到非第�?��触屏时线段的长度
						float newLineDistance = (float) Math.sqrt(Math.pow(event.getX(1) - event.getX(0), 2) + Math.pow(event.getY(1) - event.getY(0), 2));
						//获取本次的缩放比�?
						rate = oldRate * newLineDistance / oldLineDistance;
					}
				}
			}
		}
		return true;
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		return super.onKeyDown(keyCode, event);
	}
	
	class ImageThread extends Thread{
		@Override
		public void run() {
			while (flag) {
				long start = System.currentTimeMillis();
				myDraw();
				long end = System.currentTimeMillis();
				try {
					if (end - start < 50) {
						Thread.sleep(50 - (end - start));
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public void myDraw() {
		try {
			canvas = sfh.lockCanvas();
			if (canvas != null) {
				canvas.drawColor(Color.BLACK);
				canvas.save();
				//缩放画布(以图片中心点进行缩放,XY轴缩放比例相�?
				bmpIcon = BitmapFactory.decodeResource(this.getResources(), R.drawable.aa);
				canvas.scale(rate, rate, screenW / 2, screenH / 2);
				int width = screenW / 2 - bmpIcon.getWidth() / 2;
				int height = screenH / 2 - bmpIcon.getHeight() / 2;
				//绘制位图icon
				canvas.drawBitmap(bmpIcon, width, height, paint);
				canvas.restore();
				//便于观察,这里绘制两个触点时形成的线�?
//				canvas.drawLine(x1, y1, x2, y2, paint);
				sfh.unlockCanvasAndPost(canvas);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
		}
	}
	
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
	}
}
 

media_play.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/displayName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:text="321321321"
        android:textColor="#AA1122" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="400dp" >

        <SurfaceView
            android:id="@+id/videoView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:scaleType="matrix" />
    </LinearLayout>

    <Button
        android:id="@+id/aaaBtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="123321" />

</LinearLayout>
 这样就实现了多点触控,放大和缩小图片的效果了,aa这个图片是自己随便找的一个,可以根据实际情况修改。
分享到:
评论
1 楼 ZSRTFAT 2013-09-08  
学习了,谢谢分享

相关推荐

    surfaceview 多点触控移动放大缩小

    surfaceview 多点触控移动放大缩小.rar

    多点触控显示

    import android.view.SurfaceView; import android.view.Window; import android.widget.ImageView; public class MyMultitouchDemo extends Activity { private static final int SCALEBASIC = 3 ;// 调整的比率 ...

    Android应用中实现手势控制图片缩放的完全攻略

    一、概述 现在app中,图片预览功能肯定是少不了的,用户基本已经...想要做到图片支持多点触控,自由的进行缩放、平移,需要了解几个知识点:Matrix , GestureDetector , ScaleGestureDetector 以及事件分发机制,ps:不

    《Google Android SDK开发范例大全(第3版)》.pdf

    7.20 多点触控屏幕事件捕捉 479 7.21 电流急急棒 481 7.22 自定义动画按钮事件 486 7.23 设置录音取样频率与显示录音时间 490 7.24 exif照片信息编辑及读取 495 7.25 声音音效均衡器、重低音与音场...

    Google Android SDK开发范例大全(第3版) 1/5

    7.20 多点触控屏幕事件捕捉 7.21 电流急急棒 7.22 自定义动画按钮事件 7.23 设置录音取样频率与显示录音时间 7.24 EXIF照片信息编辑及读取 7.25 声音音效均衡器、重低音与音场控制 7.26 在自定义的SurfaceView上绘制...

    Google Android SDK开发范例大全(第3版)part2

     7.20 多点触控屏幕事件捕捉  7.21 电流急急棒  7.22 自定义动画按钮事件  7.23 设置录音取样频率与显示录音时间  7.24 EXIF照片信息编辑及读取  7.25 声音音效均衡器、重低音与音场控制  7.26 在...

    Google Android SDK开发范例大全(第3版) 4/5

    7.20 多点触控屏幕事件捕捉 7.21 电流急急棒 7.22 自定义动画按钮事件 7.23 设置录音取样频率与显示录音时间 7.24 EXIF照片信息编辑及读取 7.25 声音音效均衡器、重低音与音场控制 7.26 在自定义的SurfaceView上绘制...

    Google Android SDK开发范例大全(第3版) 3/5

    7.20 多点触控屏幕事件捕捉 7.21 电流急急棒 7.22 自定义动画按钮事件 7.23 设置录音取样频率与显示录音时间 7.24 EXIF照片信息编辑及读取 7.25 声音音效均衡器、重低音与音场控制 7.26 在自定义的SurfaceView上绘制...

    Google Android SDK开发范例大全(第3版) 5/5

    7.20 多点触控屏幕事件捕捉 7.21 电流急急棒 7.22 自定义动画按钮事件 7.23 设置录音取样频率与显示录音时间 7.24 EXIF照片信息编辑及读取 7.25 声音音效均衡器、重低音与音场控制 7.26 在自定义的SurfaceView上绘制...

    Android 3D游戏开发技术宝典-OpenGL ES 2.0 (吴亚峰) 源代码

    19.2 多点触控 537 19.2.1 案例效果与基本原理 537 19.2.2 开发步骤 538 19.3 多键监听 541 19.3.1 案例效果与基本原理 541 19.3.2 开发步骤 542 19.4 本章小结 544 第20章 bn赛艇 545...

Global site tag (gtag.js) - Google Analytics