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 ...
随机推荐
- MySQL数据库中,使用游标循环遍历
/*对*dt库下的所有数据表删除docuemttype为空和documenttype为MD,PD,ET的数据:delete from 表名 where length(documenttype)< ...
- cocos2d-x 获取当前播放第几帧最高效的方法
前言 把互联网翻了个遍, 所有的方法都千篇一律. 用循环去判断! 很神奇的是, 几乎所有博文举的例子, 连数字都是一样的. 这么一个效率烂成渣的方法, 居然被普遍赞同. 以下是广为流传的方法. ; i ...
- [转载] extern "C"的用法解析
本文转载自: http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html 1.引言 C++语言的创建初衷是“a better ...
- Spring AOP (下)
4.方式二:schema配置 a.业务类: /** * 业务类 * * @author yanbin * */ public class AspectBusiness { /** * 切入点 */ p ...
- window.showModalDialog以及window.open用法简介
.可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象.例如:------------------------------parent.htm<script& ...
- python运维开发之第九天
一.paramiko模块 1.简介 大家会发现,常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法 ...
- 如何让div出现滚动条
由于DIV本身属性并没有滚动条设置,但是有些地方的设计却需要出现滚动条,如何实现呢?本人采用CSS样式来控制显示!而且也很简单,代码如下: <div style="OVERFLOW-Y ...
- Codeforces 138D World of Darkraft
有一个n*m 的棋盘,每个点上标记了L,R,X 中的一个每次能选择一个没有被攻击过的点(i,j),从这个点开始发射线,射线形状为:1. 若字符是 L,向左下角和右上角发,遇到被攻击过的点就停下来2. ...
- 前端面试题第二波,要offer的看过来~
快来测试测试自己掌握能力吧! 1. class.forname的作用?为什么要用? 1).获取Class对象的方式:类名.class.对象.getClass().Class.forName(" ...
- ES聚合实例
在es中需要根据app_categor进行聚合,JSON查询语句如下: { "query": { "bool": { "must": [ { ...