差补器原理:

图标拖拽:

   

activity_drag_view.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5.  
  6. <!-- 2个TextView,一个显示一个隐藏 -->
  7. <TextView
  8. android:id="@+id/tv_top"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:layout_alignParentTop="true"
  12. android:layout_centerHorizontal="true"
  13. android:background="@drawable/call_locate_blue"
  14. android:gravity="center"
  15. android:padding="15dp"
  16. android:text="按住提示框拖到任意位置\n按手机返回键立即生效"
  17. android:textColor="@color/black"
  18. android:textSize="18sp" />
  19.  
  20. <TextView
  21. android:id="@+id/tv_bottom"
  22. android:layout_width="match_parent"
  23. android:layout_height="wrap_content"
  24. android:layout_alignParentBottom="true"
  25. android:layout_centerHorizontal="true"
  26. android:background="@drawable/call_locate_blue"
  27. android:gravity="center"
  28. android:padding="10dp"
  29. android:text="按住提示框拖到任意位置\n按手机返回键立即生效"
  30. android:textColor="@color/black"
  31. android:textSize="18sp"
  32. android:visibility="invisible" />
  33.  
  34. <!-- 拖拽的图片 -->
  35. <ImageView
  36. android:id="@+id/iv_drag"
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. android:layout_marginTop="90dp"
  40. android:src="@drawable/drag" />
  41.  
  42. </RelativeLayout>

                       

  1. package com.itheima52.mobilesafe.activity;
  2.  
  3. import android.app.Activity;
  4. import android.content.SharedPreferences;
  5. import android.content.SharedPreferences.Editor;
  6. import android.os.Bundle;
  7. import android.os.SystemClock;
  8. import android.view.MotionEvent;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.view.View.OnTouchListener;
  12. import android.widget.ImageView;
  13. import android.widget.RelativeLayout;
  14. import android.widget.TextView;
  15.  
  16. import com.itheima52.mobilesafe.R;
  17.  
  18. /**
  19. * 修改归属地显示位置
  20. *
  21. * 半透明效果:清单文件<activity
  22. android:name=".activity.DragViewActivity"
  23. android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 这个acticity透明没有标题栏。
  24.  
  25. xml文件<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  26. android:layout_width="match_parent"
  27. android:layout_height="match_parent"
  28. android:background="#5000" 背景半透明
  29. >
  30. */
  31. public class DragViewActivity extends Activity {
  32.  
  33. private TextView tvTop;
  34. private TextView tvBottom;
  35.  
  36. private ImageView ivDrag;
  37.  
  38. private int startX;
  39. private int startY;
  40. private SharedPreferences mPref;
  41.  
  42. long[] mHits = new long[2];// 数组长度表示要点击的次数
  43.  
  44. @Override
  45. protected void onCreate(Bundle savedInstanceState) {
  46. super.onCreate(savedInstanceState);
  47. setContentView(R.layout.activity_drag_view);
  48.  
  49. mPref = getSharedPreferences("config", MODE_PRIVATE);
  50.  
  51. tvTop = (TextView) findViewById(R.id.tv_top);
  52. tvBottom = (TextView) findViewById(R.id.tv_bottom);
  53. ivDrag = (ImageView) findViewById(R.id.iv_drag);
  54.  
  55. int lastX = mPref.getInt("lastX", 0);
  56. int lastY = mPref.getInt("lastY", 0);
  57.  
  58. // 获取屏幕宽高
  59. final int winWidth = getWindowManager().getDefaultDisplay().getWidth();
  60. final int winHeight = getWindowManager().getDefaultDisplay().getHeight();
  61.  
  62. if (lastY > winHeight / 2) {// 上边显示,下边隐藏
  63. tvTop.setVisibility(View.VISIBLE);
  64. tvBottom.setVisibility(View.INVISIBLE);
  65. } else {
  66. tvTop.setVisibility(View.INVISIBLE);
  67. tvBottom.setVisibility(View.VISIBLE);
  68. }
  69. // ivDrag.getWidth();获取不到,因为还没有绘制完毕。
  70. // onMeasure(测量view), onLayout(安放位置), onDraw(绘制)
  71. // ivDrag.layout(lastX, lastY, lastX + ivDrag.getWidth(),lastY + ivDrag.getHeight());//不能用这个方法,因为还没有测量完成,就不能安放位置,下面的方法就可以,RelativeLayout是控件的父控件。
  72. RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) ivDrag.getLayoutParams();// 获取布局对象
  73. layoutParams.leftMargin = lastX;// 设置左边距
  74. layoutParams.topMargin = lastY;// 设置top边距
  75. ivDrag.setLayoutParams(layoutParams);// 重新设置位置
  76.  
  77. ivDrag.setOnClickListener(new OnClickListener() {
  78. @Override
  79. public void onClick(View v) {
  80. System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
  81. mHits[mHits.length - 1] = SystemClock.uptimeMillis();// 开机后开始计算的时间
  82. if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
  83. // 把图片居中
  84. ivDrag.layout(winWidth / 2 - ivDrag.getWidth() / 2,
  85. ivDrag.getTop(), winWidth / 2 + ivDrag.getWidth()
  86. / 2, ivDrag.getBottom());
  87. }
  88. }
  89. });
  90.  
  91. // 设置触摸监听
  92. ivDrag.setOnTouchListener(new OnTouchListener() {
  93. @Override
  94. public boolean onTouch(View v, MotionEvent event) {
  95. switch (event.getAction()) {
  96. case MotionEvent.ACTION_DOWN:
  97. // 初始化起点坐标
  98. startX = (int) event.getRawX();
  99. startY = (int) event.getRawY();
  100. break;
  101. case MotionEvent.ACTION_MOVE:
  102. int endX = (int) event.getRawX();
  103. int endY = (int) event.getRawY();
  104.  
  105. // 计算移动偏移量
  106. int dx = endX - startX;
  107. int dy = endY - startY;
  108.  
  109. // 更新左上右下距离
  110. int l = ivDrag.getLeft() + dx;
  111. int r = ivDrag.getRight() + dx;
  112.  
  113. int t = ivDrag.getTop() + dy;
  114. int b = ivDrag.getBottom() + dy;
  115.  
  116. // 判断是否超出屏幕边界, 注意状态栏的高度
  117. if (l < 0 || r > winWidth || t < 0 || b > winHeight - 20) {
  118. break;
  119. }
  120.  
  121. // 根据图片位置,决定提示框显示和隐藏
  122. if (t > winHeight / 2) {// 上边显示,下边隐藏
  123. tvTop.setVisibility(View.VISIBLE);
  124. tvBottom.setVisibility(View.INVISIBLE);
  125. } else {
  126. tvTop.setVisibility(View.INVISIBLE);
  127. tvBottom.setVisibility(View.VISIBLE);
  128. }
  129.  
  130. // 更新界面(左上右下),因为已经绘制完成了,所以可以使用layout()方法。
  131. ivDrag.layout(l, t, r, b);
  132.  
  133. // 重新初始化起点坐标
  134. startX = (int) event.getRawX();
  135. startY = (int) event.getRawY();
  136. break;
  137. case MotionEvent.ACTION_UP:
  138. // 记录坐标点
  139. Editor edit = mPref.edit();
  140. edit.putInt("lastX", ivDrag.getLeft());
  141. edit.putInt("lastY", ivDrag.getTop());
  142. edit.commit();
  143. break;
  144. default:
  145. break;
  146. }
  147. return false;//事件要向下传递,让onclick(双击事件)可以响应
  148. }
  149. });
  150. }
  151. }
  1. /**
  2. * 自定义归属地浮窗Toast, 需要权限android.permission.SYSTEM_ALERT_WINDOW
  3. */
  4. private void showToast(String text) {
  5. mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
  6.  
  7. // 获取屏幕宽高
  8. winWidth = mWM.getDefaultDisplay().getWidth();
  9. winHeight = mWM.getDefaultDisplay().getHeight();
  10.  
  11. params = new WindowManager.LayoutParams();
  12. params.height = WindowManager.LayoutParams.WRAP_CONTENT;
  13. params.width = WindowManager.LayoutParams.WRAP_CONTENT;
  14. params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
  15. | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
  16. params.format = PixelFormat.TRANSLUCENT;
  17. params.type = WindowManager.LayoutParams.TYPE_PHONE;// 电话窗口。它用于电话交互(特别是呼入)。它置于所有应用程序之上,状态栏之下。
  18. params.gravity = Gravity.LEFT + Gravity.TOP;// 将重心位置设置为左上方,
  19. // 也就是(0,0)从左上方开始,而不是默认的重心位置
  20. params.setTitle("Toast");
  21.  
  22. int lastX = mPref.getInt("lastX", 0);
  23. int lastY = mPref.getInt("lastY", 0);
  24.  
  25. // 设置浮窗的位置, 基于左上方的偏移量
  26. params.x = lastX;
  27. params.y = lastY;
  28.  
  29. // view = new TextView(this);
  30. view = View.inflate(this, R.layout.toast_address, null);
  31.  
  32. int[] bgs = new int[] { R.drawable.call_locate_white,
  33. R.drawable.call_locate_orange, R.drawable.call_locate_blue,
  34. R.drawable.call_locate_gray, R.drawable.call_locate_green };
  35. int style = mPref.getInt("address_style", 0);
  36.  
  37. view.setBackgroundResource(bgs[style]);// 根据存储的样式更新背景
  38.  
  39. TextView tvText = (TextView) view.findViewById(R.id.tv_number);
  40. tvText.setText(text);
  41.  
  42. mWM.addView(view, params);// 将view添加在屏幕上(Window)
  43.  
  44. view.setOnTouchListener(new OnTouchListener() {
  45.  
  46. @Override
  47. public boolean onTouch(View v, MotionEvent event) {
  48. switch (event.getAction()) {
  49. case MotionEvent.ACTION_DOWN:
  50. // 初始化起点坐标
  51. startX = (int) event.getRawX();
  52. startY = (int) event.getRawY();
  53. break;
  54. case MotionEvent.ACTION_MOVE:
  55. int endX = (int) event.getRawX();
  56. int endY = (int) event.getRawY();
  57.  
  58. // 计算移动偏移量
  59. int dx = endX - startX;
  60. int dy = endY - startY;
  61.  
  62. // 更新浮窗位置,WindowManager里面只可以用params实现位置的移动
  63. params.x += dx;
  64. params.y += dy;
  65.  
  66. // 防止坐标偏离屏幕
  67. if (params.x < 0) {
  68. params.x = 0;
  69. }
  70.  
  71. if (params.y < 0) {
  72. params.y = 0;
  73. }
  74.  
  75. // 防止坐标偏离屏幕
  76. if (params.x > winWidth - view.getWidth()) {
  77. params.x = winWidth - view.getWidth();
  78. }
  79.  
  80. if (params.y > winHeight - view.getHeight()) {
  81. params.y = winHeight - view.getHeight();
  82. }
  83.  
  84. // System.out.println("x:" + params.x + ";y:" + params.y);
  85.  
  86. mWM.updateViewLayout(view, params);
  87.  
  88. // 重新初始化起点坐标
  89. startX = (int) event.getRawX();
  90. startY = (int) event.getRawY();
  91. break;
  92. case MotionEvent.ACTION_UP:
  93. // 记录坐标点
  94. Editor edit = mPref.edit();
  95. edit.putInt("lastX", params.x);
  96. edit.putInt("lastY", params.y);
  97. edit.commit();
  98. break;
  99.  
  100. default:
  101. break;
  102. }
  103. return true;
  104. }
  105. });
  106. }

android136 360 拖拽的更多相关文章

  1. jQuery可拖拽3D万花筒旋转特效

    这是一个使用了CSS3立体效果的强大特效,本特效使用jQuery跟CSS3 transform来实现在用户鼠标按下拖动时,环形图片墙可以跟随鼠标进行3D旋转动画. 效果体验:http://hovert ...

  2. canvas 图片拖拽旋转之二——canvas状态保存(save和restore)

    引言 在上一篇日志“canvas 图片拖拽旋转之一”中,对坐标转换有了比较深入的了解,但是仅仅利用坐标转换实现的拖拽旋转,会改变canvas坐标系的状态,从而影响画布上其他元素的绘制.因此,这个时候需 ...

  3. js拖拽3D立方体旋转

    这段时间有点闲,所以就自己找些小玩意来练习练习.今天做了一个可以拖拽页面内空白位置3D立方体就会跟着转动的小例子,布局方面用到css3 3D转换技术,通过transform控制旋转实现的. 上个图 代 ...

  4. JQ实现3D拖拽效果

    <!DOCTYPE HTML> <html onselectstart='return false'> <head> <meta http-equiv=&qu ...

  5. jquery 实现页面拖拽并保存到cookie

    实现的效果就是页面内的图片可拖拽到任意位置,并将所在位置保存.下次打开页面依然可见.本文是作demo用,实际开发中,位置的数据应保存到数据库中. 好了,开始. 1.准备工作. a.jquery(1.7 ...

  6. js手写图片查看器(图片的缩放、旋转、拖拽)

    在做一次代码编辑任务中,要查看图片器.在时间允许的条件下,放弃了已经封装好的图片jq插件,现在自己手写js实现图片的缩放.旋转.推拽功能! 具体代码如下: <!DOCTYPE html> ...

  7. js实现图片查看器(图片的缩放、旋转、拖拽)

    一.关于图片查看器. 目前网络上能找到的图片查看器很多,谁便一搜就能出来.如:jquery.iviewer.js.Viewer.js这两个js文件,其中功能也足够满足大部分开发需求.但是单纯的就想实现 ...

  8. angularjs1 自定义图片查看器(可旋转、放大、缩小、拖拽)

    笔记: angularjs1 制作自定义图片查看器(可旋转.放大.缩小.拖拽) 2018-01-12 更新  可以在我的博客  查看我 已经封装好的 纯 js写的图片查看器插件    博客链接 懒得把 ...

  9. [ActionScript 3.0] 动态绘制扇形实例(拖拽绘制)

    package { import flash.display.Shape; import flash.display.Sprite; import flash.events.MouseEvent; / ...

随机推荐

  1. 通过移动的Mas接口发送短信

    1. 首先,需要移动公司提供的用户名.密码.服务ID.接口Url等信息. 2. 将短信信息整理成XML格式的字符串,再转为byte数组,通过POST的方式,将短信发往Mas接口.需要引用"M ...

  2. ZEat

    借助微博平台,记录每日饮食情况的Andorid程序. 项目地址:https://github.com/atskyline/ZEat 1.0.0APK下载地址:https://github.com/at ...

  3. Clone PDB from same CDB

    Clone PDB 用途: 1.用于测试,从生产系统clone数据来进行测试 2.诊断性能问题   Clone PDB Using OMF from same CDB 环境信息: DB Version ...

  4. opencv2.4.4 背景减除算法收集

    算法集合:https://code.google.com/p/bgslibrary/ 测试:AdaptiveBackgroundLearning算法 #include <iostream> ...

  5. init进程学习

    linux的init进程 一个在线编辑markdown文档的编辑器,是内核启动的第一个进程,init进程有很多重要的任务,它的pit 为1,在linux shell中使用pstree命令可以看到它为其 ...

  6. 利用python进行折线图,直方图和饼图的绘制

    我用10个国家某年的GDP来绘图,数据如下: labels   = ['USA', 'China', 'India', 'Japan', 'Germany', 'Russia', 'Brazil', ...

  7. dataStructure@ Binary Search Tree

    #include<iostream> #include<cstdio> #include<cstring> #include<limits> #incl ...

  8. Excel里的单元格提行

    最近老板发了个表,遇到了个小知识点,收藏以后有用!拿来学学 如下,是属于单元格.怎么提行? 直接,空格或space,都无法解决!...... 解决办法:Alt + Enter 成功! 参考: http ...

  9. Go语言 字符串

    在所有编程语言中都涉及到大量的字符串操作,可见熟悉对字符串的操作是何等重要. Go中的字符串和C#中的一样(java也是),字符串内容在初始化后不可修改. 需要注意的是在Go中字符串是有UTF-8编码 ...

  10. java类的访问控制符与其他几个特殊修饰符的总结

    1  访问控制符 1.1 字段或者方法的访问控制符   同一个类中 同一个包中 不同包中的子类 不同包中的非子类 private YES       默认(包可访问) YES YES     prot ...