21.移动控件

效果:

  1. <TextView
  2. android:id="@+id/tv_top"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:layout_alignParentTop="true"
  6. android:layout_centerHorizontal="true"
  7. android:background="@drawable/call_locate_blue"
  8. android:gravity="center"
  9. android:padding="15dp"
  10. android:text="按住提示框拖到任意位置\n按手机返回键立即生效"
  11. android:textColor="@color/black"
  12. android:textSize="18sp" />
  13. <TextView
  14. android:id="@+id/tv_bottom"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:layout_alignParentBottom="true"
  18. android:layout_centerHorizontal="true"
  19. android:background="@drawable/call_locate_blue"
  20. android:gravity="center"
  21. android:padding="10dp"
  22. android:text="按住提示框拖到任意位置\n按手机返回键立即生效"
  23. android:textColor="@color/black"
  24. android:textSize="18sp"
  25. android:visibility="invisible" />
  26. <ImageView
  27. android:id="@+id/iv_drag"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:layout_marginTop="90dp"
  31. android:src="@drawable/drag" />
  1. /**
  2. * 修改归属地显示位置
  3. *
  4. * @author Kevin
  5. *
  6. */
  7. public class DragViewActivity extends Activity {
  8. private TextView tvTop;
  9. private TextView tvBottom;
  10. private ImageView ivDrag;
  11. private int startX;
  12. private int startY;
  13. private SharedPreferences mPref;
  14. long[] mHits = new long[2];// 数组长度表示要点击的次数
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_drag_view);
  19. mPref = getSharedPreferences("config", MODE_PRIVATE);
  20. tvTop = (TextView) findViewById(R.id.tv_top);
  21. tvBottom = (TextView) findViewById(R.id.tv_bottom);
  22. ivDrag = (ImageView) findViewById(R.id.iv_drag);
  23. int lastX = mPref.getInt("lastX", 0);
  24. int lastY = mPref.getInt("lastY", 0);
  25. // ivDrag.getWidth();
  26. // onMeasure(测量view), onLayout(安放位置), onDraw(绘制)
  27. // ivDrag.layout(lastX, lastY, lastX + ivDrag.getWidth(),
  28. // lastY + ivDrag.getHeight());//不能用这个方法,因为还没有测量完成,就不能安放位置
  29. // 获取屏幕宽高
  30. final int winWidth = getWindowManager().getDefaultDisplay().getWidth();
  31. final int winHeight = getWindowManager().getDefaultDisplay()
  32. .getHeight();
  33. if (lastY > winHeight / 2) {// 上边显示,下边隐藏
  34. tvTop.setVisibility(View.VISIBLE);
  35. tvBottom.setVisibility(View.INVISIBLE);
  36. } else {
  37. tvTop.setVisibility(View.INVISIBLE);
  38. tvBottom.setVisibility(View.VISIBLE);
  39. }
  40. RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) ivDrag
  41. .getLayoutParams();// 获取布局对象
  42. layoutParams.leftMargin = lastX;// 设置左边距
  43. layoutParams.topMargin = lastY;// 设置top边距
  44. ivDrag.setLayoutParams(layoutParams);// 重新设置位置
  45. ivDrag.setOnClickListener(new OnClickListener() {
  46. @Override
  47. public void onClick(View v) {
  48. System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
  49. mHits[mHits.length - 1] = SystemClock.uptimeMillis();// 开机后开始计算的时间
  50. if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
  51. // 把图片居中
  52. ivDrag.layout(winWidth / 2 - ivDrag.getWidth() / 2,
  53. ivDrag.getTop(), winWidth / 2 + ivDrag.getWidth()
  54. / 2, ivDrag.getBottom());
  55. }
  56. }
  57. });
  58. // 设置触摸监听
  59. ivDrag.setOnTouchListener(new OnTouchListener() {
  60. @Override
  61. public boolean onTouch(View v, MotionEvent event) {
  62. switch (event.getAction()) {
  63. case MotionEvent.ACTION_DOWN:
  64. // 初始化起点坐标
  65. startX = (int) event.getRawX();
  66. startY = (int) event.getRawY();
  67. break;
  68. case MotionEvent.ACTION_MOVE:
  69. int endX = (int) event.getRawX();
  70. int endY = (int) event.getRawY();
  71. // 计算移动偏移量
  72. int dx = endX - startX;
  73. int dy = endY - startY;
  74. // 更新左上右下距离
  75. int l = ivDrag.getLeft() + dx;
  76. int r = ivDrag.getRight() + dx;
  77. int t = ivDrag.getTop() + dy;
  78. int b = ivDrag.getBottom() + dy;
  79. // 判断是否超出屏幕边界, 注意状态栏的高度
  80. if (l < 0 || r > winWidth || t < 0 || b > winHeight - 20) {
  81. break;
  82. }
  83. // 根据图片位置,决定提示框显示和隐藏
  84. if (t > winHeight / 2) {// 上边显示,下边隐藏
  85. tvTop.setVisibility(View.VISIBLE);
  86. tvBottom.setVisibility(View.INVISIBLE);
  87. } else {
  88. tvTop.setVisibility(View.INVISIBLE);
  89. tvBottom.setVisibility(View.VISIBLE);
  90. }
  91. // 更新界面
  92. ivDrag.layout(l, t, r, b);
  93. // 重新初始化起点坐标
  94. startX = (int) event.getRawX();
  95. startY = (int) event.getRawY();
  96. break;
  97. case MotionEvent.ACTION_UP:
  98. // 记录坐标点
  99. Editor edit = mPref.edit();
  100. edit.putInt("lastX", ivDrag.getLeft());
  101. edit.putInt("lastY", ivDrag.getTop());
  102. edit.commit();
  103. break;
  104. default:
  105. break;
  106. }
  107. return false;//事件要向下传递,让onclick(双击事件)可以响应
  108. }
  109. });
  110. }
  111. }

来自为知笔记(Wiz)

时间: 2024-11-05 06:12:49

21.移动控件的相关文章

Android可移动控件

可移动控件: 效果图: 获取屏幕的宽高: 1 DisplayMetrics dm = getResources().getDisplayMetrics(); 2 screenWidth = dm.widthPixels; 3 screenHeight = dm.heightPixels - 50; 4 ImageView imageView = (ImageView)findViewById(R.id.spirit_img); 5 imageView.setOnTouchListener(thi

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

2016/5/21学习记录

1.重大教训!先上代码 1 package Pra; 2 3 public class Read { 4 5 public static void main(String[] args) { 6 T a = new T(); 7 Read.swap(a); 8 System.out.println("e1 = "+a.e1+"e2 = "+a.e2); 9 } 10 public static void swap(T t){ 11 int temp = t.e1;

JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.java源文件代码: public class Test{ public static void main(String[] args){ //实现接口Singer Singer s1 = new Student("Amy"); s1.sing(); s1.sleep(); s1.study

Java程序最容易犯的21种错误

1.Duplicated Code 代码重复几乎是最常见的异味了.他也是Refactoring的主要目标之一.代码重复往往来自于copy-and-paste的编程风格.与他相对应OAOO是一个好系统的重要标志. 2.Long method 它是传统结构化的"遗毒".一个方法应当具有自我独立的意图,不要把几个意图放在一起. 3.Large Class 大类就是你把太多的责任交给了一个类.这里的规则是One Class One Responsibility. 4.Divergent Cha

android studio :com.android.support:appcompat-v7:21.+ 报错

android studio :com.android.support:appcompat-v7:21.+ 报错: 在project——>app——>build.gradle修改: apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.example.ri

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

21 Guns -- Green Day

21 Guns Green Day (绿日乐队)的代表曲之一.歌曲的主题是反战,同时安慰了曾 经信任布什政府如今失望透顶的美国民众.这首歌也被电影<变形金刚2> 当作插曲. Do you know what's worth fighting for When it's not worth dying for? Does it take your breath away And you feel yourself suffocating1?Does the pain weigh out the

普林斯顿公开课 算法2-1:排序概述

目标 对所有类型的数据进行排序. 问题 排序函数如何知道比较的是哪种类型的数据呢? 回调函数 这时候就需要引入回调函数的概念了.回调函数就是将可执行的代码作为参数进行传递. 实现回调的方法 在Java中可以通过接口来实现,在C语言中可以通过函数指针来实现,C++中可以通过class-type functor,也就是重载操作符operator ()的类,在C#中可以使用Delegate委托,在Python/Perl/ML/javascript中可以直接传递函数. JDK中提供了Comparable