- 浏览: 242022 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
maotou1988:
android基于netty的发送图片与文字demo,楼主共勉 ...
在android中使用netty框架通信 -
ZSRTFAT:
学习了,谢谢分享
android 基于surfaceview 的多点触控实现 -
charlotte:
学习了!!!!!
Java nio 客户端连接Server -
nilo:
您好, 本人菜鸟, 正在学习设计模式. 当我学习完简单工厂模式 ...
策略模式 -
fokman:
一江春水邀明月 写道缺少SocketInfoUtils Th ...
Java nio 客户端连接Server
android 基于surfaceview 的多点触控实现
- 博客分类:
- android
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这个图片是自己随便找的一个,可以根据实际情况修改。
发表评论
-
获得手机相关信息的实现方法
2015-04-04 00:55 820本文介绍了如何通过android提供的servi ... -
android判断当前sdk版本以及是否是平板
2013-11-19 13:53 1326最近做了一个项目中需要使用appWidget,但是 ... -
android 程序检查当前应用是否在运行
2012-11-09 17:05 1121最近做一个项目,需要知道当前的android 程序是 ... -
netty 找不到org.jboss.netty.bootstrap.ClientBootstrap解决
2012-09-25 14:20 4082今天碰到一个莫名其妙的问题,在做socket连接的时候发 ... -
Netty 之Oio程序编写
2012-09-24 14:06 4598今日将android里面使用的socket 方式改成 ... -
定义文本样式
2012-09-06 14:19 1092android程序中的按钮经常需要定义文字的大小,是否加粗,居 ... -
点击按钮显示不同的状态
2012-09-06 14:05 1026android给我们提供的UI还比较丰富,但是基本上都 ... -
android 两个listView 共存的显示问题
2012-08-07 09:55 2537如果在一个layout里面需要定义有两个listvie ... -
定义带箭头的Button 样式
2012-08-02 10:58 11215定义一个圆角的Button 样式 <style ... -
android UI入门三 自定义背景样式
2012-08-01 15:23 1406在android 开发应用中,大部份的开发人员 ... -
android UI入门二 定义图片横竖屏切换正确显示
2012-07-30 13:20 3246android开发的时候通常会使用到横竖屏切换,但是 ... -
android UI入门一
2012-07-24 12:20 950在ios系统中,常常看到绚丽的画面让人心动不已。然而在 ... -
android spinner 实现国码选择
2012-07-13 15:33 3979android 中得Spinner相当于是一个下拉框 ... -
在自己的android应用中调用打电话实现
2012-07-13 15:10 1087最近在做一个项目,需要在自己写的应用中调用打电话给别人 ... -
android 定义圆角Button
2012-06-30 15:31 5078定义styles.xml <?xml version= ... -
android 自定义导航控件
2012-06-26 15:19 7888在编写android应用程序的过程中,经常会使用到导航 ... -
android observer 处理handler消息
2012-06-12 09:41 2085在开发android网络应用程序,通常都会使用han ... -
android wifi 处理
2012-06-12 09:35 3227在android应用程序中可以很方便的使用wifi来处理不同的 ... -
android canvas 使用
2012-04-06 09:38 7682Canvas 又称为画布,在游戏开发过程中是一个经常使用的类。 ... -
给android imageView(图片) 添加超链接
2012-03-29 09:29 8095hi ,各位好朋友,最近忙于开发没有时间更新博客。 有很多朋 ...
相关推荐
综上所述,实现SurfaceView的多点触控移动放大缩小涉及到了Android的触摸事件处理、矩阵变换、多线程编程等多个知识点。通过理解并熟练运用这些技术,可以为用户提供流畅且响应迅速的交互体验。在实际开发中,可以...
1. `SurfaceView` 或 `ViewGroup`: 这是Android UI层次结构中的一个视图,通常用作多点触控事件的接收者。开发者会在这些类的子类中重写`onTouchEvent(MotionEvent event)`方法,来处理触控事件。 2. `MotionEvent`...
本实例源码着重展示了如何在Android应用中实现多点触控功能。下面我们将深入探讨Android多点触控的实现原理以及源码中的关键部分。 一、Android多点触控基础 1. 触摸事件(MotionEvent) 在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开发中,多点触控(Multitouch)是一项重要的功能,允许用户通过多个手指同时与屏幕交互,实现如缩放、旋转等复杂操作。本文将深入探讨Android多点触控的原理,并通过一个实际的开发实例来展示如何实现多点...
这通常涉及到自定义控件,以便实现图片的自由移动、自由缩放以及多点触控操作,比如双击放大缩小。本教程将深入探讨如何实现这样一个功能强大的图片查看器。 首先,我们需要创建一个自定义的ImageView子类,我们...
当用户在屏幕上进行捏合操作时,我们需要捕获这些多点触控事件(`MotionEvent`)。Android中的`GestureDetector`和`ScaleGestureDetector`类可以帮助我们轻松识别出捏合手势,这两个工具类可以帮助我们检测双指滑动...
通过学习和实践这个基础的图形程序,开发者可以深入了解Android的图形绘制、触摸事件处理以及多点触控的基本原理,为更复杂的图形应用开发打下坚实的基础。这个程序不仅涵盖了基本的编程概念,还涉及到了Android特有...
3. **多点触控**:Android提供了对多点触控的支持,通过MotionEvent.getPointerCount()和MotionEvent.getPointerId()等方法可以获取当前触控点的数量和每个点的ID,用于区分不同的触控事件。 4. **视图更新**:在...
总的来说,Android游戏中的触屏事件处理涉及了Android事件模型、自定义View或SurfaceView的使用、多点触控支持以及性能优化等多个方面。开发者需要对这些知识点有深入的理解,才能构建出响应灵敏、用户体验优秀的...
用户可以通过触摸屏幕来拖动圆,同时支持多点触控功能,比如两点触控实现圆的删除,三点触控添加新的圆。 【Android图形界面】 Android系统提供了丰富的API用于图形绘制,如Canvas和Paint类,它们是Android图形...
4. **多点触控**:为了实现双指删除和三指添加的功能,你需要利用MotionEvent的getPointerCount()方法获取当前触摸点的数量,并通过getActionMasked()和getActionIndex()确定每个手指的具体动作。当指针数量达到特定...
本文将详细解析如何通过继承SurfaceView来实现"图片标注可缩放点击跳转"这一功能,主要涉及的技术点包括自定义View、多点触控手势识别、图片处理以及事件监听。 首先,我们需要理解SurfaceView。SurfaceView是...
关节拖拽通常涉及到多点触控(Multi-Touch)技术,Android支持多种触摸事件,包括`ACTION_POINTER_DOWN`和`ACTION_POINTER_UP`,用于处理多个触点的按下和抬起事件。在实现鼠标关节拖拽时,开发者需要跟踪每个触点的...
- 对于支持多点触控的设备,可以处理多个`MotionEvent`同时发生,实现画笔的拖拽和缩放等手势。 - `MotionEvent.getPointerCount()`可以获取当前触摸点的数量,`getPointerId(int index)`和`getX(int index)`/`...
通过这个工具,J2ME的游戏和应用程序可以在Android设备上运行,保持原有的功能和用户体验,同时利用Android设备的硬件优势,如多点触控、高分辨率屏幕和更强大的处理能力。 在实际使用过程中,开发者需要熟悉以下...
然而,真正的实现可能更复杂,需要考虑更多的细节,比如页面边缘的撕裂效果、页面的物理惯性、多点触控支持等。此外,还可以结合OpenGL ES等底层图形库,实现更高效的渲染。 总的来说,“Android翻页效果原理实现之...
总的来说,"旋转、缩放、移动"这个主题涵盖了Android的多点触控处理、Matrix变换以及SurfaceView和Canvas的使用,这些都是Android开发中的核心技能。理解并熟练掌握这些知识点,对于开发复杂的图形界面应用至关重要...