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 ...
随机推荐
- 【转载】逃离adapter的地狱-针对多个View type的组合实现方案
英文原文:JOE'S GREAT ADAPTER HELL ESCAPE 转载地址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015 ...
- SQL Server 2008创建定期自动备份任务
首先需要启动SQL Server Agent服务,这个服务如果不启动是无法运行新建作业的,点击“开始”–“所有程序”–“Microsoft SQL Server 2008”–“启动SQL Server ...
- 对ajax的hack的分析
先上原文链接:对jQuery ajax请求成功(失败)回调执行前的统一处理(兼容较老版本jQuery) 原文中已经提到了使用场景了,我觉得这非常适合单页面应用,还有backbone应用中.毕竟ajax ...
- iOS App完整项目
前言 iOS开发学习者都希望得到实战训练,但是很多资料都是只有一小部分代码,并不能形成完成的App,笔者在此处收集了很多开源的完整的App,都有源代码哦! 完整项目 Phonetic Swift 写的 ...
- 【USACO 2.4.4】回家
[描述] 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛). 在挤奶 ...
- C语言内存对齐原理
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...
- Unity扩展编辑器--类型1:Editor Windows
Extending the Editor Unity允许你使用自己定制的inspectors和Editor Windows扩展编辑器,并且你可以使用定制的Property Drawers定义属性集在i ...
- Spark笔记-treeReduce、reduce、reduceByKey
参考资料: http://stackoverflow.com/questions/32281417/understadning-treereduce-in-spark http://stackover ...
- Android中AsyncTask异步
今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...
- PHP之路——PHPStudy虚拟主机
一: Apache/conf/httpd.conf打开以下扩展 LoadModule rewrite_module modules/mod_rewrite.so LoadModule vhost_al ...