您的位置:首页 > 其它

实现:TextView自由复制功能

2014-06-26 19:49 295 查看


源代码已经上传,链接地址: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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: