随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(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();
}