源代码已经上传,链接地址: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. edm注意细节

    Email Direct Marketing不要有js,css也放在html里面不能有热区,所有的border要设置为0在浏览器里面邮件发送可能会歪掉,可以测试接受后是否歪掉 有点时候表格会有细缝等等 ...

  2. memset,memcpy,memcmp用法

    void* memset(void *s, int ch, size_t n); 将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值. 例如:memset(lpMyStruct ...

  3. PHP程序员面试技巧之口试题分享

    网络上流传很广的一部分php工程师面试题目,有些phper们认为这些很形式,天下面试题目一大把,不能考核一个人的真实水平,其实细细研究起来,无论怎样,能存在就表明其有存在的价值.下面小编整理了12条P ...

  4. IDOC创建、发送、接收及程序代码[转]

    什么是IDOC,以及IDOC的步骤   创建IDOC:   第一步:WE31 创建IDOC所包含的字段.   第二步:WE30 创建IDOC 把Segment分配给IDOC   第三步:WE81  创 ...

  5. Maven(1)-安装和配置

    Maven(1)-安装和配置 一.本机必须安装好Jdk 二 .maven下载 http://maven.apache.org/download.cgi ,下载后把maven-bin解压到自己的目录即可 ...

  6. RedHat 安装MySQL数据库【转】

      朋友购买了阿里云的服务器,服务器上自带有CentOS操作系统,但是开发软件需要自己安装,接下来将介绍本地RedHat Linux 5.10虚拟机上搭建Mysql数据库. 一.软件准备 (1)jdk ...

  7. spring mvc读取url变量

    @RequestMapping(value="/{id}/{name}", method=RequestMethod.GET) public ModelAndView getUrl ...

  8. 如何使用Weave以及Docker搭建Nginx反向代理/负载均衡服务器

    Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动 ...

  9. 在 Linux 中怎样将 MySQL 迁移到 MariaDB 上

    自从甲骨文收购 MySQL 后,由于甲骨文对 MySQL 的开发和维护更多倾向于闭门的立场,很多 MySQL 的开发者和用户放弃了 MySQL.在社区驱动下,促使更多人移到 MySQL 的另一个叫 M ...

  10. 如何理解java中的变量和常量

    int a =10;这是一个变量,在后面的代码中你可以去更改a的值但如果你在声明a的时候加上了final,那么a就成了常量,后面的代码是不允许对a做修改的.还有一点你要注意,被final修饰的常量必须 ...