使用手势缩放文本

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

思路:为呈现文本的组件注册setOnTouchListener监听,然后判断缩放来改变字体大小。

MainActivity:

package com.home.mutitouch;

import java.io.InputStream;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		TextView textView = (TextView) this.findViewById(R.id.main_tv);
		try {
			textView.setText(readText());
		} catch (Exception e) {
			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");
	}
}

ZoomTextView:

package com.home.mutitouch;

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 = 80.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);
	}

}

ZoomView:

package com.home.mutitouch;

import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

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();
}




 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u010142437

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值