前言
我们在浏览网页时,网页的文本可以放大缩小,android两点手势,两点距离靠近时缩小,两点距离远离时候是放大。那么若果不用android的WebView控件,单纯的TextView能否做到放大缩小呢,其实也是可以的。只要响应和处理手势事件即可。
注:本文demo源码下载地址:http://download.csdn.net/detail/dxzysk/5752815
一、效果图
Sample制作的界面效果如下图所示:
界面不是很漂亮,大家按照需要修改一下
二、部分代码
1,抽象类ZoomView设置触摸手势事件接口
package nishik.ncc.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()
{
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();
}
2,ZoomTextView实现具体的抽象类ZoomView中的触摸手势事件接口
package nishik.ncc.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);
}
}
3,MultiTouchTextActivity使用ZoomTextView对象设置接口
package nishik.ncc.text;
import java.io.InputStream;
import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.widget.TextView;
public class MultiTouchTextActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView) this.findViewById(R.id.text_view);
//textView.setMovementMethod(ScrollingMovementMethod.getInstance());
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");
InputStream is = getAssets().open("text.txt");
int index = is.available();
byte data[] = new byte[index];
is.read(data);
return new String(data, "UTF-8");
}
}