android——单点触控移动,多点触控放大缩小
xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <ImageView
android:id="@+id/imgage"
android:src="@drawable/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
/> </RelativeLayout>

java

package com.example.touchdemo; import android.os.Bundle;
import android.app.Activity;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast; public class MainActivity extends Activity {
private ImageView image;
float lastDistance = -1;
float x0 = 0;
float y0 = 0;
private int screenWidth;
private int screenHeight; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); image = (ImageView) findViewById(R.id.imgage);
//获得屏幕宽高 不让出界
DisplayMetrics dm = getResources().getDisplayMetrics();
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels-100;
image.setOnTouchListener(new OnTouchListener() { private float x;
private float y; @Override
public boolean onTouch(View v,final MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
Log.i("TAG","触摸开始......");
switch (action) {
case MotionEvent.ACTION_DOWN:
//getX()是表示Widget相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕)
x = event.getRawX();
y = event.getRawX();
break; case MotionEvent.ACTION_MOVE:
//得到触摸点的个数
int count = event.getPointerCount();
Log.i("TAG","触摸点的个数:"+count); if(count > 1){
Log.i("TAG", event.getX(0)+","+event.getY(0)+"|"+event.getX(1)+","+event.getY(1));
//获得两点的坐标差
float distanceX = event.getX(0) - event.getX(1);
float distanceY = event.getY(0) - event.getY(1);
//获得两点之间的距离
float betweenDistance = (float) Math.sqrt(distanceX*distanceX + distanceY*distanceY);
Log.i("TAG","当前两点之间的新距离:"+betweenDistance); if(betweenDistance < 1){
lastDistance = betweenDistance; }else if((betweenDistance - lastDistance) > 5){
//放大
lastDistance = betweenDistance;
//获得布局参数
RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) image.getLayoutParams();
params.width = (int) (image.getWidth()*1.1f);
params.height = (int) (image.getHeight()*1.1f);
image.setLayoutParams(params);
}else if((lastDistance - betweenDistance) > 5){
lastDistance = betweenDistance;
//获得布局参数
RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) image.getLayoutParams();
params.width = (int) (image.getWidth()*0.9f);
params.height = (int) (image.getHeight()*0.9f);
image.setLayoutParams(params);
} }else if(count == 1){ //移动距离
float rawX = event.getRawX()-x;
float rawy = event.getRawY()-y;
//定义新的
int left = (int) (image.getLeft()+rawX);
int top = (int) (image.getTop()+rawy);
int right = (int) (image.getRight()+rawX);
int bottom = (int) (image.getBottom()+rawy);
// 设置不能出界
if (left < 0) {
left = 0;
right = left + v.getWidth();
} if (right > screenWidth) {
right = screenWidth;
left = right - v.getWidth();
} if (top < 0) {
top = 0;
bottom = top + v.getHeight();
} if (bottom > screenHeight) {
bottom = screenHeight;
top = bottom - v.getHeight();
} //赋值
image.layout(left, top, right, bottom);
//改成新的按下作标
x=event.getRawX();
y=event.getRawY();
/*return false;*/
}
break; } return true;
}
});
}
//全局移动
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
/*image.setX(event.getX());
image.setY(event.getY()); */
return true;
} }

android——单点触控移动,多点触控放大缩小的更多相关文章
- 新鲜出炉:appium2.0+ 单点触控和多点触控新的解决方案
在 appium2.0 之前,在移动端设备上的触屏操作,单手指触屏和多手指触屏分别是由 TouchAction 类,Multiaction 类实现的. 在 appium2.0 之后,这 2 个方法将会 ...
- android小程序-电子钢琴-多点触控
我在第一篇博客<android小程序-电子钢琴-滑动连续响应>中实现了一个简单地7键钢琴,这几天把它又完善了一下,增加了多点触控,按键也增加了一个低音区和一个高音区,使得又可以多弹一点简单 ...
- android 百度最新地图sdk包怎么去除 放大缩小按钮
// 隐藏缩放控件 int childCount = mMapView.getChildCount(); View zoom = null; ; i < childCount; i++) { V ...
- Android多点触控技术
1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouc ...
- 【朝花夕拾】Android自定义View篇之(八)多点触控(上)MotionEvent简介
前言 在前面的文章中,介绍了不少触摸相关的知识,但都是基于单点触控的,即一次只用一根手指.但是在实际使用App中,常常是多根手指同时操作,这就需要用到多点触控相关的知识了.多点触控是在Android2 ...
- Android多点触控手势基础
处理多点触控手势 多点触控就是同时把一根以上的手指放在屏幕上. 再继续往下以前需要补充一些名词: 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的 ...
- android 多点触控
多点触控 1.多点触控从字面意思讲就是你用大于等于2根的手指触摸子啊手机屏幕上. Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEv ...
- WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用
一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...
- Android 本地/网路下载图片实现放大缩小
Android 本地加载/网路下载图片实现放大缩小拖拉效果,自定义控件. package com.example.ImageViewCustom; import android.app.Activi ...
- Android 多点触控与简单手势(一)
现在一般的Android手机都会使用电容触摸屏最少可以支持两点触摸,多的可能是七八个,所以基本上都会支持多点触控, android系统中应用程序可以使用多点触控的事件来完成各种手势和场景需求. And ...
随机推荐
- documentElement和ownerDocument和ownerElement
1.document.documentElement是指文档根节点----HTML元素 2.element.ownerDocument是指当前元素所在的文档对象----document 3.attrO ...
- office-001-Outlook邮件配置图文详解
本节以 Windows 7 操作系统下 Microsoft Outlook 配置电子邮件的方法,配以图文进行详解.敬请各位亲们参阅,若有不足之处,敬请指正,不胜感激! 闲话少数,话归正题.默认用户已经 ...
- 【转】Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用
Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用 分类: Android UI2015-06-15 16: ...
- ubuntu mysql 远程连接
最近需要远程连接mysql服务器,先进行简单的测试,过程记录于此. 参考链接: http://blog.chinaunix.net/uid-28458801-id-3445261.html http: ...
- Quartz的配置文件quartz.properties详解
配置 quartz.properties 文件 文件 quartz.properties 定义了 Quartz 应用运行时行为,还包含了许多能控制 Quartz 运转的属性.这个文件应该放在class ...
- 基础-训练营-day1~day5
基础 大纲 变量: 声明.初始化.使用.命名 数据类型: int.long.double.boolean.char.String 运算符: 赋值.算术.关系.逻辑 ...
- RouteOS软路由HotSpot热点认证网关
实现要求: 实现局域网有线无线需在网页输入用户名和密码登录,不同用户登录有不同的访问内外网权限. 环境要求: 一台PC机安装三张网卡,第一张网卡连接外网,第二张网卡配置局域网,第三张网卡做配置连接使用 ...
- 解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing
版本问题,最直接的解决办法就是重新编辑安装git吧: 1. 下载:# wget -O git.zip https://github.com/git/git/archive/master.zip 2. ...
- javascript设计模式学习之四——单例模式,缓存与对象池
单例模式的定义:确保一个实例,并提供全局访问. 惰性单例的定义:只在需要的时候才创建对象. 在开发中,有些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等. java中的单例 关 ...
- sublime 垂直编辑
http://www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html