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 ...
随机推荐
- typedef 和 const
1. typedef 允许你为各种数据类型定义新名字 #include <stdio.h>typedef char *ptr_to_char; //这让我看起来,好奇怪,不好读void m ...
- String的类型的数据
字符串类型的数据也是计算机基础. var box = "lc"; var box1 = 'lc1'; //不管是单引号还双引号,都必须成对出现 1.ECMAscript规定字符串是 ...
- JQuery:JQuery删除元素
JQuery:删除元素通过 jQuery,可以很容易地删除已有的 HTML 元素.删除元素/内容.如需删除元素和内容,一般可使用以下两个 jQuery 方法: remove() - 删除被选元素(及其 ...
- 感知开源的力量-APICloud Studio开源技术分享会
2014.9.15 中国领先的“云端一体”移动应用云服务提供商APICloud正式发布2015.9.15,APICloud上线一周年,迎来第一个生日这一天,APICloud 举办APICloud St ...
- PHP加密解密字符串
项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理. 最常见的应用在用户登录以及一些AP ...
- HBase shell
进入命令行 ./hbase shell 查看HBase shell帮助 help 查看命令帮助 直接输入命令回撤 创建命名空间 create_namespace 'ns1' 查看命名空间 list_n ...
- C# 统计程序执行时间
随便写写,小马哥勿怪 最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷. 话说马云年轻的时候也是屌丝一枚,有图为证 现 ...
- hibernate反向生成映射文件报错
报错原因:可能是你的数据库里的某个表没设置主键.
- RAC数据库迁移ASM磁盘组到其它存储
环境介绍: 一共有两个磁盘组:crs和data:crs使用normal冗余:data使用外部冗余. 添加新的asm磁盘过程(略) 1.迁移前 SQL> select group_number, ...
- jQuery:多个AJAX/JSON请求对应单个回调并行加载
因为我们使用jQuery,这意味着需要调用 jQuery.getScript 和 jQuery.getJSON 函数. 我知道这些函数都是异步执行(asyncronously)并且会延迟一段时间返回, ...