Android 单指触控拖拽,两指触控缩放
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams; public class MainActivity extends Activity { View view;
public static final int DRAG = 1;
public static final int SCALE = 2;
int mode = 1;
float lengthOld = 1;//初始化两指之间原长 //初始化圆点高宽,java代码中操作的宽高都是像素值,dp*density转成px
int width = 40;
int height = 40; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Log.e("TAG", "像素密度:"+getResources().getDisplayMetrics().density);
view = findViewById(R.id.view);
} /**
* 在MainActivity中画一个圆
* Activity重写onTouchEvent,触摸监听
* getRawX(),getRawY()是获取手机屏幕上的点到屏幕左上角顶点的距离
* getX(),getY()是获取视图坐标,子视图在父视图中的位置
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
//记录坐标,圆点距离视图顶点
int x = (int) event.getX();
int y = (int) event.getY(); //多指触控
//获取事件源,并通过event.getActionMasked()加入多点触控支持
switch (event.getAction() & event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
//单指移动
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
//多指缩放
Log.e("TAG", "多指移动");
mode = SCALE;
//计算两指间开始的原长
lengthOld = calculation(event);
break;
case MotionEvent.ACTION_UP:
lengthOld = 1;//复位
break;
case MotionEvent.ACTION_MOVE:
if(mode == DRAG){
//单指,直接设置坐标
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(width, height);
params.setMargins(x, y, 0, 0);
view.setLayoutParams(params); }else{
//两指缩放,要计算缩放比例
float scale = calculation(event) / lengthOld;
width = (int) (view.getWidth() * scale);
height = (int) (view.getHeight() * scale); FrameLayout.LayoutParams params = (LayoutParams) view.getLayoutParams();
params.width = width;
params.height = height;
view.setLayoutParams(params);
}
break;
} return true;
} private float calculation(MotionEvent event) { float x1 = event.getX();
float x2 = event.getX(1);
float y1 = event.getY();
float y2 = event.getY(1); return (float) Math.sqrt(Math.pow((x1-x2), 2)+Math.pow((y1-y2), 2));
}
}
xml中设置
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <View
android:id="@+id/view"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@drawable/oval" /> </FrameLayout>
Android 单指触控拖拽,两指触控缩放的更多相关文章
- 拖拽TreeViewItem到OCX控件
由于C#在性能方面,和C++还是有不少的差距,所以在项目中有一块是用C++的OCX控件实现,然后包括在WPF项目中.由于C++,C#属于不同的体系架构,造成了许多问题,特使是拖拽TreeViewIte ...
- Java3D读取3DMax模型并实现鼠标拖拽、旋转、滚轮缩放等功能
/**-------------------------------------------------代码区--------------------------------------------- ...
- D3.js 力导向图的拖拽(drag)与缩放(zoom)
不知道大家会不会跟我一样遇到这样的问题,在之前做的力导向图的基础上加上缩放功能的时候,拖动节点时整体会平移不再是之前酷炫的效果(失去了拉扯的感觉!).天啊,简直不能接受如此丑X的效果.经过不懈的努力终 ...
- Android中的ScrollView实现 拖拽反弹效果
public class BounceScrollView extends ScrollView { private View inner;// 孩子View private float y;// 点 ...
- touchstart、touchmove、touchend 实现移动端上的触屏拖拽
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- div拖拽到iframe上方 导致 缩放和拖拽的不平滑和鼠标事件未放开 解决方法
思路一:用在开始进行缩放(触发了resizable的start事件)为iframe添加z-index属性,将iframe放置在最下层. $("#draggable").resiza ...
- winform 两个TreeView间拖拽节点
/// <summary> /// 正在拖拽的节点 /// </summary> private TreeNode DragNode = null; /// <summa ...
- WPF中元素拖拽的两个实例
今天结合之前做过的一些拖拽的例子来对这个方面进行一些总结,这里主要用两个例子来说明在WPF中如何使用拖拽进行操作,元素拖拽是一个常见的操作,第一个拖拽的例子是将ListBox中的子元素拖拽到ListV ...
- WPF 实现控件间拖拽内容
想实现这样一个常用功能:在ListBox的一个Item上点住左键,然后拖拽到另外一个控件(如ListView中),松开左键,数据已经拖拽过来. 步骤如下: 1. 设置ListBox 的AllowDro ...
随机推荐
- 初识Activity
Callback Description onCreate() This is the first callback and called when the activity is first cre ...
- C#设置IP地址,启用禁用适配器
界面效果图如下: 报表界面 说下关键代码 需要开启 Windows Management Instrumentation服务(默认已经开启),在程序中需要增加 Management引用. 主要有Net ...
- 绘图时,根据size()和自定义rect编程的区别
在绘图的时候,很多时候编写的代码需要根据当前窗口自身的size来进行绘制,这个时候可以添加一个额外的中间rect来做过度,这样以后的绘图机制不会 随着size的变化而不断变化.你的处理逻辑可以保持不变 ...
- 下拉菜单选择(jQuery实现)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- C#制作ActiveX控件及部署升级(摘自网络)
使用C#开发ActiveX控件 控件开发.制作CAB包.签名.部署 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序 ...
- extjs之messagebox按钮显示中文
在extjs中我们用到了很多的提示框,但是在对话框按钮上面显示的都是英文的ok.yes.no.cancel,这里给出一个方法,能够使得提示框的按钮文本显示问中文. extjs在加载完成之后会调用页面的 ...
- checkbox复选框全选批量删除
多选框全选实现批量删除 html代码 <body> <form action="" method="post" name="Form ...
- memcache锁
锁的使用,一般情况是针对并发或者我们希望程序(crontab的job)串行处理,我们加锁的办法有很多,像文件锁,数据库锁,或者memcache锁,这里关注一下memcache锁,针对memcache锁 ...
- Python学习笔记:05类
类 Python是面向对象的语言,面向对象最重要的三个优点有: 多态:多态使对象具备不同的行为方式.(可以认为声明了接口,但是实现方式可能多样) 封装:封装是对全局作用域中隐藏多余信息的原则(创建对象 ...
- 使用django-mssql时候报pythoncom模块不存在
pip install django-mssql是链接sqlserver的数据库db引擎,这里用到了pythoncom模块,所以还需要安装 pip install pypiwin32 settings ...