源代码已经上传,链接地址:http://download.csdn.net/detail/huangyabin001/7556825


  1. package com.example.copyfree;
  2.  
  3. import android.app.ActionBar;
  4. import android.app.Activity;
  5. import android.app.AlertDialog;
  6. import android.app.AlertDialog.Builder;
  7. import android.content.DialogInterface;
  8. import android.content.DialogInterface.OnClickListener;
  9. import android.os.Bundle;
  10. import android.os.Handler;
  11. import android.os.Message;
  12. import android.text.TextUtils;
  13. import android.text.method.HideReturnsTransformationMethod;
  14. import android.util.TypedValue;
  15. import android.view.GestureDetector;
  16. import android.view.Menu;
  17. import android.view.MenuItem;
  18. import android.view.MotionEvent;
  19. import android.view.ScaleGestureDetector;
  20. import android.view.View;
  21. import android.widget.EditText;
  22. import android.widget.TextView;
  23. import android.widget.Toast;
  24.  
  25. public class CopyFreeActivity extends Activity {
  26. private static final String TAG = "SelectTextToCopyActivity";
  27. private float mScaleFactor = 1;
  28. private ScaleGestureDetector mScaleDetector;
  29. private GestureDetector mGestureDetector;
  30. private TextView text;
  31. private EditText edit;
  32.  
  33. private static final int ZOOM_IN = 4;
  34. private static final int ZOOM_OUT = 5;
  35. private final int MAX_ZOOM_IN_SIZE = 60;
  36. private final int MAX_ZOOM_OUT_SIZE = 20;
  37. private final int THE_SIZE_OF_PER_ZOOM = 9;
  38. private float mTextSize = 27;
  39. private int mZoomMsg = -1;
  40.  
  41. @Override
  42. protected void onCreate(Bundle savedInstanceState) {
  43. super.onCreate(savedInstanceState);
  44. setContentView(R.layout.activity_copy_free);
  45. initUi();
  46. }
  47.  
  48. @Override
  49. public boolean onCreateOptionsMenu(Menu menu) {
  50. return true;
  51. }
  52.  
  53. public void button(View view) {
  54. if (TextUtils.isEmpty(edit.getText())) {
  55. Toast.makeText(this, "请输入测试内容!", 0).show();
  56. } else
  57. text.setText(edit.getText());
  58. }
  59.  
  60. @Override
  61. public boolean onSearchRequested() {
  62. return false;
  63. }
  64.  
  65. @Override
  66. public boolean onOptionsItemSelected(MenuItem item) {
  67. switch (item.getItemId()) {
  68. case android.R.id.home:
  69. AlertDialog.Builder dialog = new AlertDialog.Builder(this);
  70. dialog.setTitle("Exit").setIcon(android.R.drawable.btn_star)
  71. .setMessage("立即退出程序?")
  72. .setPositiveButton("确定", new OnClickListener() {
  73.  
  74. @Override
  75. public void onClick(DialogInterface dialog, int which) {
  76. CopyFreeActivity.this.finish();
  77. }
  78. }).setNegativeButton("取消", new OnClickListener() {
  79.  
  80. @Override
  81. public void onClick(DialogInterface dialog, int which) {
  82. dialog.cancel();
  83. }
  84. }).show();
  85. break;
  86.  
  87. }
  88. return super.onOptionsItemSelected(item);
  89. }
  90.  
  91. private void initUi() {
  92. text = (TextView) findViewById(R.id.text);
  93. edit = (EditText) findViewById(R.id.edit);
  94. text.setTransformationMethod(HideReturnsTransformationMethod
  95. .getInstance());
  96. text.setTextIsSelectable(true);
  97. mScaleDetector = new ScaleGestureDetector(this, new MyScaleListener());
  98. mGestureDetector = new GestureDetector(this,
  99. new GestureDetector.SimpleOnGestureListener() {
  100. });
  101. mGestureDetector.setOnDoubleTapListener(null);
  102. ActionBar actionBar = getActionBar();
  103. actionBar.setDisplayHomeAsUpEnabled(true);
  104. }
  105.  
  106. private Handler mUiHandler = new Handler() {
  107. @Override
  108. public void handleMessage(Message msg) {
  109. switch (msg.what) {
  110. case ZOOM_IN:
  111. zoomIn();
  112. text.invalidate();
  113. break;
  114. case ZOOM_OUT:
  115. zoomOut();
  116. text.invalidate();//修改TextView后,调用该方法刷新TextView,这样才能看到重新绘制的界面。
  117. break;
  118. default:
  119. break;
  120. }
  121. }
  122. };
  123.  
  124. private void zoomIn() {
  125. mTextSize = mTextSize + THE_SIZE_OF_PER_ZOOM <= MAX_ZOOM_IN_SIZE ? mTextSize
  126. + THE_SIZE_OF_PER_ZOOM
  127. : MAX_ZOOM_IN_SIZE;
  128. if (mTextSize >= MAX_ZOOM_IN_SIZE) {
  129. mTextSize = MAX_ZOOM_IN_SIZE;
  130. }
  131. text.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
  132. }
  133.  
  134. private void zoomOut() {
  135. mTextSize = mTextSize - THE_SIZE_OF_PER_ZOOM < MAX_ZOOM_OUT_SIZE ? MAX_ZOOM_OUT_SIZE
  136. : mTextSize - THE_SIZE_OF_PER_ZOOM;
  137. if (mTextSize <= MAX_ZOOM_OUT_SIZE) {
  138. mTextSize = MAX_ZOOM_OUT_SIZE;
  139. }
  140. text.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
  141. }
  142.  
  143. private class MyScaleListener extends
  144. ScaleGestureDetector.SimpleOnScaleGestureListener {
  145. @Override
  146. public boolean onScale(ScaleGestureDetector detector) {
  147. float scale = detector.getScaleFactor();
  148. if (scale < 0.999999 || scale > 1.00001) {
  149. mScaleFactor = scale;
  150. }
  151. return true;
  152. }
  153.  
  154. @Override
  155. public boolean onScaleBegin(ScaleGestureDetector detector) {
  156. return true;
  157. }
  158.  
  159. @Override
  160. public void onScaleEnd(ScaleGestureDetector detector) {
  161. float scale = detector.getScaleFactor();
  162. if (mScaleFactor > 1.0) {
  163. mZoomMsg = ZOOM_IN;
  164. } else if (mScaleFactor < 1.0) {
  165. mZoomMsg = ZOOM_OUT;
  166. }
  167. }
  168. }
  169.  
  170. public boolean onInterceptTouchEvent(MotionEvent ev) {
  171. mScaleDetector.onTouchEvent(ev);
  172. final int action = ev.getAction();
  173. switch (action) {
  174. case MotionEvent.ACTION_DOWN:
  175. mGestureDetector.onTouchEvent(ev);
  176. return false;
  177.  
  178. case MotionEvent.ACTION_MOVE:
  179. mGestureDetector.onTouchEvent(ev);
  180. return false;
  181.  
  182. case MotionEvent.ACTION_UP:
  183. mGestureDetector.onTouchEvent(ev);
  184. Message msg = Message.obtain();
  185. msg.what = mZoomMsg;
  186. mUiHandler.sendMessage(msg);
  187. mZoomMsg = -1;
  188. return false;
  189. }
  190. return true;
  191. }
  192.  
  193. public boolean onTouchEvent(MotionEvent ev) {
  194. mScaleDetector.onTouchEvent(ev);
  195. final int action = ev.getAction();
  196.  
  197. switch (action) {
  198. case MotionEvent.ACTION_DOWN:
  199. mGestureDetector.onTouchEvent(ev);
  200. return true;
  201.  
  202. case MotionEvent.ACTION_MOVE:
  203. mGestureDetector.onTouchEvent(ev);
  204. return true;
  205.  
  206. case MotionEvent.ACTION_UP:
  207. mGestureDetector.onTouchEvent(ev);
  208. Message msg = Message.obtain();
  209. msg.what = mZoomMsg;
  210. mUiHandler.sendMessage(msg);
  211. mZoomMsg = -1;
  212. return true;
  213.  
  214. case MotionEvent.ACTION_CANCEL:
  215. mGestureDetector.onTouchEvent(ev);
  216. return true;
  217.  
  218. default:
  219. if (mGestureDetector.onTouchEvent(ev)) {
  220. return true;
  221. }
  222.  
  223. return true;
  224. }
  225. }
  226.  
  227. @Override
  228. protected void onDestroy() {
  229. super.onDestroy();
  230. mUiHandler.removeCallbacksAndMessages(null);
  231. }
  232. }



实现:TextView自由复制功能的更多相关文章

  1. 使用框架帮助Activity规范化

    摘要 本文原创,转载请注明地址:http://kymjs.com/code/2015/05/10/01 写给那些在用.想用.还没有用过KJFrame的朋友. KJFrameForAndroid总共分为 ...

  2. Chrome操作技巧

    好用的插件: 如果你用 Chrome 浏览器,这8款插件一定要用! - 知乎 沙拉查词:     集合各大翻译,详细好用权威 Simple Allow Copy: 开启被网页屏蔽的自由复制功能 Qui ...

  3. 嵌套在ScrollView中的TextView控件可以自由滚动

    //设置TextView控件可以自由滚动,由于这个TextView嵌套在ScrollView中,所以在OnTouch事件中通知父控件ScrollView不要干扰. mContractDesc.setO ...

  4. android TextView 支持长按自由复制

    因为EditText支持系统的长按自由复制,所以只需要把EditText通过配置达到TextView效果就行了 <EditText android:id="@+id/subject_i ...

  5. 【转】TextView长按复制实现方法小结

    有这么一个需求,用户在浏览文本信息时希望长按信息就能弹出复制的选项方便保存或者在别的页面使用这些信息.类似的, 就像长按WebView或者EditText的内容就自动弹出复制选项. 这里面主要是2个特 ...

  6. Android TextView setText内嵌html标签

    由于得到的数据是保存在数据库里面的,不好对数据的某一部分进行操作.解决办法在数据库里面存数据的时候加上html的标签对, 如data = <中华人名共和国道路交通安全实施条例>第<u ...

  7. 一个可以自由定制外观、支持拖拽消除的MaterialDesign风格Android BadgeView

    为了尊重作者,先放上链接:https://github.com/qstumn/BadgeView BadgeView 一个可以自由定制外观.支持拖拽消除的MaterialDesign风格Android ...

  8. [Android] TextView长按复制实现方法小结(转载)

    这是别人写的,既然别人总结过了,那我就不花时间研究这个了,但往后会补充一些使用经验之类的 原文地址:http://blog.csdn.net/stzy00/article/details/414778 ...

  9. 浅谈android中只使用一个TextView实现高仿京东,淘宝各种倒计时

    今天给大家带来的是只使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.近期公司一直加班也没来得及时间去整理,今天难得歇息想把这个分享给大家.只求共同学习,以及自己兴许 ...

随机推荐

  1. VBA控件一些属性的解释

    VBA每个控件都有很多属性,虽然可以按照分类排序,但由于没有中文解释,有些属性也不了解如何使用,下面是一些控件属性的解释,不全,可供参考: 常规AutoLoad (Excel)打开工作簿时是否加载控件 ...

  2. jsp有关resquest与session和application的区别和相似性

    1. request 的setAttribute与getAttribute方法一般都是成对出现的,首先通过setAttribute方法设置属性与属性值,然后通过 getAttribute方法根据属性获 ...

  3. NPOI相关

    总结一下工作中遇到的NPOI以及在ASP.NET MVC中的使用 http://www.cnblogs.com/fenglingyi/p/4750323.html

  4. python中关闭文件

    1.关闭文件,通过f.write把内容写入文件会覆盖之前文件中的内容

  5. github注册使用以及体会

    一.个人介绍 我叫冯越,学号是1413042065,班级是网络工程143,兴趣爱好有打羽毛球,素描,读书,个人编程能力一般,行数没有计算过,大一学习C++时,实验题目一些书后的题目,大二学习数据结构时 ...

  6. SQL 创建索引的作用以及如何创建索引

    SQL 创建索引的作用以及如何创建索引 SQL 创建索引的作用 一.使用索引的优点: 1.通过唯一性索引(unique)可确保数据的唯一性 2.加快数据的检索速度 3.加快表之间的连接 4.减少分组和 ...

  7. Eclipse 反编译器

    Help-->Install New SoftWare 贴上反编译地址:http://opensource.cpupk.com/decompiler/update/ 选择add,一路向北,起飞.

  8. Git工作流指南:集中式工作流

    转载:http://blog.jobbole.com/76847/ 本文由 伯乐在线 - 李鼎 翻译.未经许可,禁止转载!英文出处:atlassian.欢迎加入翻译组. 转到分布式版本控制系统看起来像 ...

  9. 关于职位的解释---转CSDN的文章

    摘要我在IT职场打滚超过15年了,从小小的程序员做到常务副总.相对于其它行业,IT职场应该算比较光明的了,但也陷阱重重,本文说说我的亲身体会,希望大家能在IT职场上战无不胜! 通用法则 法则1:忍耐是 ...

  10. ViewPager滑动页面的实现方法

    package com.lixu.pagerview; import java.util.ArrayList; import android.app.Activity; import android. ...