实现:TextView自由复制功能
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自由复制功能的更多相关文章
- 使用框架帮助Activity规范化
摘要 本文原创,转载请注明地址:http://kymjs.com/code/2015/05/10/01 写给那些在用.想用.还没有用过KJFrame的朋友. KJFrameForAndroid总共分为 ...
- Chrome操作技巧
好用的插件: 如果你用 Chrome 浏览器,这8款插件一定要用! - 知乎 沙拉查词: 集合各大翻译,详细好用权威 Simple Allow Copy: 开启被网页屏蔽的自由复制功能 Qui ...
- 嵌套在ScrollView中的TextView控件可以自由滚动
//设置TextView控件可以自由滚动,由于这个TextView嵌套在ScrollView中,所以在OnTouch事件中通知父控件ScrollView不要干扰. mContractDesc.setO ...
- android TextView 支持长按自由复制
因为EditText支持系统的长按自由复制,所以只需要把EditText通过配置达到TextView效果就行了 <EditText android:id="@+id/subject_i ...
- 【转】TextView长按复制实现方法小结
有这么一个需求,用户在浏览文本信息时希望长按信息就能弹出复制的选项方便保存或者在别的页面使用这些信息.类似的, 就像长按WebView或者EditText的内容就自动弹出复制选项. 这里面主要是2个特 ...
- Android TextView setText内嵌html标签
由于得到的数据是保存在数据库里面的,不好对数据的某一部分进行操作.解决办法在数据库里面存数据的时候加上html的标签对, 如data = <中华人名共和国道路交通安全实施条例>第<u ...
- 一个可以自由定制外观、支持拖拽消除的MaterialDesign风格Android BadgeView
为了尊重作者,先放上链接:https://github.com/qstumn/BadgeView BadgeView 一个可以自由定制外观.支持拖拽消除的MaterialDesign风格Android ...
- [Android] TextView长按复制实现方法小结(转载)
这是别人写的,既然别人总结过了,那我就不花时间研究这个了,但往后会补充一些使用经验之类的 原文地址:http://blog.csdn.net/stzy00/article/details/414778 ...
- 浅谈android中只使用一个TextView实现高仿京东,淘宝各种倒计时
今天给大家带来的是只使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.近期公司一直加班也没来得及时间去整理,今天难得歇息想把这个分享给大家.只求共同学习,以及自己兴许 ...
随机推荐
- Java_Ant 详解
1,什么是antant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台 --因为 ...
- (27)odoo 中改变菜单动作的默认视图
一个动作下面有多个视图来支持,像表单视图.列表视图.看板视图.图表视图等 这时我们想改变系统默认指定的视图,方法其实有两种,一种是通过面板改,一种是开发一个小模块 举一例:项目默认打开是用了看板视图, ...
- 集成 AliPay - 支付宝
作者感言 前面我已经写了一篇关于WeChat SDK的支付篇, 那我们继续研究接下来的支付SDK, 这次就是国民支付软件支付宝, 下面就让我们来看看怎么集成AliPay SDK.最后:如果你有更好的建 ...
- jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示
1.jquery ajax请求方式与提示用户正在处理请稍等 为了提高用户体验度,我们通常会给出 “正在处理,请稍等!”诸如此类的提示.我们可通过设置$.ajax()下的参数beforeSend()来实 ...
- SAP资产变动明细
*&---------------------------------------------------------------------* *& Report ZFIR027 * ...
- ASP.NET Web API中的依赖注入
什么是依赖注入 依赖,就是一个对象需要的另一个对象,比如说,这是我们通常定义的一个用来处理数据访问的存储,让我们用一个例子来解释,首先,定义一个领域模型如下: namespace Pattern.DI ...
- 《Play for Java》学习笔记(七)数据类型解析——Body parser
一.什么是body parser? body parser(不知道具体如何翻译,~~~~(>_<)~~~~ )指一个HTTP请求 (如POST和PUT操作)所包含的文本内容(body),这 ...
- 【转】数据库范式(1NF 2NF 3NF BCNF)详解二
以下内容转自:http://jacki6.iteye.com/blog/774889 -------------------------分割线----------------------------- ...
- Storm(4) - Distributed Remote Procedure Calls
Using DRPC to complete the required processing 1. Create a new branch of your source using the follo ...
- 用PHP做服务器接口客户端用http协议POST访问安全性一般怎么做
我的问题是,如果不做安全相关处理的话,一些可能改变数据库的操作可能会遭遇垃圾数据提交什么的,毕竟要找到这些信息只要找个http包就可以了 系统无用户登录 新手问题(从来没做过服务端开发),如果可以,给 ...