`
fokman
  • 浏览: 242022 次
  • 性别: 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的多点触控移动放大缩小涉及到了Android的触摸事件处理、矩阵变换、多线程编程等多个知识点。通过理解并熟练运用这些技术,可以为用户提供流畅且响应迅速的交互体验。在实际开发中,可以...

    安卓Android源码——多点触控实例源码.zip

    1. `SurfaceView` 或 `ViewGroup`: 这是Android UI层次结构中的一个视图,通常用作多点触控事件的接收者。开发者会在这些类的子类中重写`onTouchEvent(MotionEvent event)`方法,来处理触控事件。 2. `MotionEvent`...

    Android 多点触控实例源码.zip

    本实例源码着重展示了如何在Android应用中实现多点触控功能。下面我们将深入探讨Android多点触控的实现原理以及源码中的关键部分。 一、Android多点触控基础 1. 触摸事件(MotionEvent) 在Android中,处理触摸...

    Android多点触控实现对图片放大缩小平移,惯性滑动等功能

    实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释 public class ZoomImageView extends ImageView implements ScaleGestureDetector.OnScaleGestureListener, View....

    多点触控显示

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

    Android开发实例之多点触控程序

    在Android开发中,多点触控(Multitouch)是一项重要的功能,允许用户通过多个手指同时与屏幕交互,实现如缩放、旋转等复杂操作。本文将深入探讨Android多点触控的原理,并通过一个实际的开发实例来展示如何实现多点...

    打造个性的图片预览与多点触控(自由移动,自由缩放,双击放大缩小)

    这通常涉及到自定义控件,以便实现图片的自由移动、自由缩放以及多点触控操作,比如双击放大缩小。本教程将深入探讨如何实现这样一个功能强大的图片查看器。 首先,我们需要创建一个自定义的ImageView子类,我们...

    SurfaceView增加放大缩小视频功能

    当用户在屏幕上进行捏合操作时,我们需要捕获这些多点触控事件(`MotionEvent`)。Android中的`GestureDetector`和`ScaleGestureDetector`类可以帮助我们轻松识别出捏合手势,这两个工具类可以帮助我们检测双指滑动...

    安卓Android源码——一个最最基础的图形程序,圆可以拖动,两点触控是删除圆,3点触控是添加一个圆.zip

    通过学习和实践这个基础的图形程序,开发者可以深入了解Android的图形绘制、触摸事件处理以及多点触控的基本原理,为更复杂的图形应用开发打下坚实的基础。这个程序不仅涵盖了基本的编程概念,还涉及到了Android特有...

    Android高级应用源码-一个最最基础的图形程序,圆可以拖动,两点触控是删除圆,3点触控是添加一个圆.zip

    3. **多点触控**:Android提供了对多点触控的支持,通过MotionEvent.getPointerCount()和MotionEvent.getPointerId()等方法可以获取当前触控点的数量和每个点的ID,用于区分不同的触控事件。 4. **视图更新**:在...

    android game 触屏事件处理

    总的来说,Android游戏中的触屏事件处理涉及了Android事件模型、自定义View或SurfaceView的使用、多点触控支持以及性能优化等多个方面。开发者需要对这些知识点有深入的理解,才能构建出响应灵敏、用户体验优秀的...

    可拖动的圆

    用户可以通过触摸屏幕来拖动圆,同时支持多点触控功能,比如两点触控实现圆的删除,三点触控添加新的圆。 【Android图形界面】 Android系统提供了丰富的API用于图形绘制,如Canvas和Paint类,它们是Android图形...

    Android应用源码之一个最最基础的图形程序,圆可以拖动,两点触控是删除圆,3点触控是添加一个圆.zip

    4. **多点触控**:为了实现双指删除和三指添加的功能,你需要利用MotionEvent的getPointerCount()方法获取当前触摸点的数量,并通过getActionMasked()和getActionIndex()确定每个手指的具体动作。当指针数量达到特定...

    图片标注可缩放点击跳转

    本文将详细解析如何通过继承SurfaceView来实现"图片标注可缩放点击跳转"这一功能,主要涉及的技术点包括自定义View、多点触控手势识别、图片处理以及事件监听。 首先,我们需要理解SurfaceView。SurfaceView是...

    Android应用源码之(鼠标关节拖拽Body).zip

    关节拖拽通常涉及到多点触控(Multi-Touch)技术,Android支持多种触摸事件,包括`ACTION_POINTER_DOWN`和`ACTION_POINTER_UP`,用于处理多个触点的按下和抬起事件。在实现鼠标关节拖拽时,开发者需要跟踪每个触点的...

    Android 屏幕画笔实现源码.rar

    - 对于支持多点触控的设备,可以处理多个`MotionEvent`同时发生,实现画笔的拖拽和缩放等手势。 - `MotionEvent.getPointerCount()`可以获取当前触摸点的数量,`getPointerId(int index)`和`getX(int index)`/`...

    j2me_android_sdk1.16

    通过这个工具,J2ME的游戏和应用程序可以在Android设备上运行,保持原有的功能和用户体验,同时利用Android设备的硬件优势,如多点触控、高分辨率屏幕和更强大的处理能力。 在实际使用过程中,开发者需要熟悉以下...

    Android翻页效果原理实现之模拟扭曲

    然而,真正的实现可能更复杂,需要考虑更多的细节,比如页面边缘的撕裂效果、页面的物理惯性、多点触控支持等。此外,还可以结合OpenGL ES等底层图形库,实现更高效的渲染。 总的来说,“Android翻页效果原理实现之...

    旋转、缩放、移动

    总的来说,"旋转、缩放、移动"这个主题涵盖了Android的多点触控处理、Matrix变换以及SurfaceView和Canvas的使用,这些都是Android开发中的核心技能。理解并熟练掌握这些知识点,对于开发复杂的图形界面应用至关重要...

Global site tag (gtag.js) - Google Analytics