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


package com.example.copyfree;

import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.text.method.HideReturnsTransformationMethod;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; public class CopyFreeActivity extends Activity {
private static final String TAG = "SelectTextToCopyActivity";
private float mScaleFactor = 1;
private ScaleGestureDetector mScaleDetector;
private GestureDetector mGestureDetector;
private TextView text;
private EditText edit; private static final int ZOOM_IN = 4;
private static final int ZOOM_OUT = 5;
private final int MAX_ZOOM_IN_SIZE = 60;
private final int MAX_ZOOM_OUT_SIZE = 20;
private final int THE_SIZE_OF_PER_ZOOM = 9;
private float mTextSize = 27;
private int mZoomMsg = -1; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_copy_free);
initUi();
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
} public void button(View view) {
if (TextUtils.isEmpty(edit.getText())) {
Toast.makeText(this, "请输入测试内容!", 0).show();
} else
text.setText(edit.getText());
} @Override
public boolean onSearchRequested() {
return false;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("Exit").setIcon(android.R.drawable.btn_star)
.setMessage("立即退出程序?")
.setPositiveButton("确定", new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
CopyFreeActivity.this.finish();
}
}).setNegativeButton("取消", new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
}).show();
break; }
return super.onOptionsItemSelected(item);
} private void initUi() {
text = (TextView) findViewById(R.id.text);
edit = (EditText) findViewById(R.id.edit);
text.setTransformationMethod(HideReturnsTransformationMethod
.getInstance());
text.setTextIsSelectable(true);
mScaleDetector = new ScaleGestureDetector(this, new MyScaleListener());
mGestureDetector = new GestureDetector(this,
new GestureDetector.SimpleOnGestureListener() {
});
mGestureDetector.setOnDoubleTapListener(null);
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
} private Handler mUiHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case ZOOM_IN:
zoomIn();
text.invalidate();
break;
case ZOOM_OUT:
zoomOut();
text.invalidate();//修改TextView后,调用该方法刷新TextView,这样才能看到重新绘制的界面。
break;
default:
break;
}
}
}; private void zoomIn() {
mTextSize = mTextSize + THE_SIZE_OF_PER_ZOOM <= MAX_ZOOM_IN_SIZE ? mTextSize
+ THE_SIZE_OF_PER_ZOOM
: MAX_ZOOM_IN_SIZE;
if (mTextSize >= MAX_ZOOM_IN_SIZE) {
mTextSize = MAX_ZOOM_IN_SIZE;
}
text.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
} private void zoomOut() {
mTextSize = mTextSize - THE_SIZE_OF_PER_ZOOM < MAX_ZOOM_OUT_SIZE ? MAX_ZOOM_OUT_SIZE
: mTextSize - THE_SIZE_OF_PER_ZOOM;
if (mTextSize <= MAX_ZOOM_OUT_SIZE) {
mTextSize = MAX_ZOOM_OUT_SIZE;
}
text.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
} private class MyScaleListener extends
ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
float scale = detector.getScaleFactor();
if (scale < 0.999999 || scale > 1.00001) {
mScaleFactor = scale;
}
return true;
} @Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return true;
} @Override
public void onScaleEnd(ScaleGestureDetector detector) {
float scale = detector.getScaleFactor();
if (mScaleFactor > 1.0) {
mZoomMsg = ZOOM_IN;
} else if (mScaleFactor < 1.0) {
mZoomMsg = ZOOM_OUT;
}
}
} public boolean onInterceptTouchEvent(MotionEvent ev) {
mScaleDetector.onTouchEvent(ev);
final int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mGestureDetector.onTouchEvent(ev);
return false; case MotionEvent.ACTION_MOVE:
mGestureDetector.onTouchEvent(ev);
return false; case MotionEvent.ACTION_UP:
mGestureDetector.onTouchEvent(ev);
Message msg = Message.obtain();
msg.what = mZoomMsg;
mUiHandler.sendMessage(msg);
mZoomMsg = -1;
return false;
}
return true;
} public boolean onTouchEvent(MotionEvent ev) {
mScaleDetector.onTouchEvent(ev);
final int action = ev.getAction(); switch (action) {
case MotionEvent.ACTION_DOWN:
mGestureDetector.onTouchEvent(ev);
return true; case MotionEvent.ACTION_MOVE:
mGestureDetector.onTouchEvent(ev);
return true; case MotionEvent.ACTION_UP:
mGestureDetector.onTouchEvent(ev);
Message msg = Message.obtain();
msg.what = mZoomMsg;
mUiHandler.sendMessage(msg);
mZoomMsg = -1;
return true; case MotionEvent.ACTION_CANCEL:
mGestureDetector.onTouchEvent(ev);
return true; default:
if (mGestureDetector.onTouchEvent(ev)) {
return true;
} return true;
}
} @Override
protected void onDestroy() {
super.onDestroy();
mUiHandler.removeCallbacksAndMessages(null);
}
}



实现: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. robotframework笔记19

    后处理输出 使用时自动测试 在测试执行报告和日志生成,并使用它 分别允许创建自定义报告和日志以及结合 和合并的结果. 使用Rebot 简介 rebot [options] robot_outputs ...

  2. 纯css3代码写无缝滚动效果

    主要用到css3中的动画 @keyframes, animation. 布局是外层一个div宽固定,然后overflow hidden 绝对定位,里面的ul 固定定位.通过对ul添加动画来实现效果.具 ...

  3. js中event.target和event.srcElement的区别

    看了很多资料绝对结果就是 firefox 下的 event.target = IE 下的 event.srcElement jquery中的event.target属性的作用是获取到出发事件的元素.j ...

  4. 找不到 -lz解决方法

    sudo apt-get install libghc-zlib-dev

  5. 关于byte[]字节传输的大端和小端小议

    当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-en ...

  6. jsp之 ---- 页面重定向和请求转发(笔记之深度说明)

    1.  HttpServletResponse对象的sendRedirect(String location)方法称作重定向. 如果location地址前面加上“/”,则表示  相对于Servlet容 ...

  7. SVN删除同名文件夹

    解     释一下:     SVN  出现这个错误的原因是我删除了一个文件夹后又创建了一个同名文件夹.  在  svn   server  端,好像是不能区分这两个文件夹,所以出现了错误.     ...

  8. mac 找文件

    如何找到 etc 方法1: ! D# D! s2 F" f 七度苹果电脑软件1.打开Finder,按快键盘 Command + Shift + G,即可调出 前往文件夹 ,也可以左上角 找到 ...

  9. Internet Explorer已限制此网页运行可以访问计算机的脚本或ActiveX控件

    在制作网页的时候,大家不免要用到script,也即是脚本,主要是VBScript以及JavaScript.那么时常遇到这样的情况: 在本地双击打开html文件时,如果是IE的话,会出现提示框(如下图) ...

  10. POJ 1050 To the Max 暴力,基础知识 难度:0

    http://poj.org/problem?id=1050 设sum[i][j]为从(1,1)到(i,j)的矩形中所有数字之和 首先处理出sum[i][j],此时左上角为(x1,y1),右下角为(x ...