首页 > 代码库 > 实现:TextView自由复制功能

实现:TextView自由复制功能


源代码已经上传,链接地址: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);
	}
}