使用装饰者模式,讲一个普通的TextView 包装成一个可放大缩小的View
关于多点触控还是要进一步学习啊。。。
package src.youer.text; import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; /** * view缩放 * * @author Administrator * * @param <V> */ public abstract class ZoomView<V extends View> { protected V view; // ----------------------------------------------- private static final int NONE = 0;// 空 private static final int DRAG = 1;// 按下第一个点 private static final int ZOOM = 2;// 按下第二个点 /** 屏幕上点的数量 */ private int mode = NONE; /** 记录按下第二个点距第一个点的距离 */ float oldDist; public ZoomView(V view) { this.view = view; setTouchListener(); } private void setTouchListener() { view.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: mode = DRAG; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; case MotionEvent.ACTION_POINTER_DOWN: oldDist = spacing(event); if (oldDist > 10f) { mode = ZOOM; } break; case MotionEvent.ACTION_MOVE: if (mode == ZOOM) { // 正在移动的点距初始点的距离 float newDist = spacing(event); if (newDist > oldDist) { zoomOut(); } if (newDist < oldDist) { zoomIn(); } } break; } return true; } /** * 求出2个触点间的 距离 * * @param event * @return */ private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } }); } protected abstract void zoomIn(); protected abstract void zoomOut(); }
package src.youer.text; import android.widget.TextView; public class ZoomTextView extends ZoomView<TextView> { /**最小字体*/ public static final float MIN_TEXT_SIZE = 10f; /**最大子图*/ public static final float MAX_TEXT_SIZE = 100.0f; /** 缩放比例 */ float scale; /** 设置字体大小 */ float textSize; public ZoomTextView(TextView view, float scale) { super(view); this.scale = scale; textSize = view.getTextSize(); } /** * 放大 */ protected void zoomOut() { textSize += scale; if (textSize > MAX_TEXT_SIZE) { textSize = MAX_TEXT_SIZE; } view.setTextSize(textSize); } /** * 缩小 */ protected void zoomIn() { textSize -= scale; if (textSize < MIN_TEXT_SIZE) { textSize = MIN_TEXT_SIZE; } view.setTextSize(textSize); } }
package src.youer.text; import java.io.InputStream; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MultiTouchTestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView textView = (TextView) this.findViewById(R.id.text_view); try { textView.setText(readText()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } float zoomScale = 0.5f;// 缩放比例 //装饰 new ZoomTextView(textView, zoomScale); } /** * 读取txt * * @param str * @return * @throws Exception */ public String readText() throws Exception { InputStream is = this.getClass() .getResourceAsStream("/assets/text.txt"); int index = is.available(); byte data[] = new byte[index]; is.read(data); return new String(data, "UTF-8"); } }