MultiTouchTestActivity.java
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) {
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.java
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);
}
}
ZoomView.java
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();
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
/>
</LinearLayout>
assets目录下的text.txt内容,可以自行修改。
手势缩放文本例子
谁整夜不回 ah 又让谁心碎
如果没人陪着我醉
安慰只会更疲惫
寂寞层层包围早已乱了错与对
天亮之前会不会
有人把我的心捡回
谁整夜不回 ah 又让谁心碎
除非梦见化成灰
不先堕落怎么飞
梦里慢慢受罪不如永远都不睡
末日之后会不会
是唯一重生的绝美
那曾经相爱的泪水
融化了整个世界的虚伪
不要拿时间去追悔
你的拥抱是那么绝对
请告诉我什么是珍贵
眼前最平凡的一切
就算痛苦还要轮回
我也无所谓相爱的泪水
谁整夜不回 ah 又让谁心碎
除非梦见化成灰
不先堕落怎么飞
梦里慢慢受罪不如永远都不睡
末日之后会不会
是唯一重生的绝美
那曾经相爱的泪水
融化了整个世界的虚伪
不要拿时间去追悔
你的拥抱是那么绝对
请告诉我什么是珍贵
眼前最平凡的一切
就算痛苦还要轮回
我也无所谓相爱的泪水
那曾经相爱的泪水
融化了整个世界的虚伪
不要拿时间去追悔
你的拥抱是那么绝对
请告诉我什么是珍贵
眼前最平凡的一切
就算痛苦还要轮回
我也无所谓相爱的泪水