您的位置:首页 > 移动开发 > Android开发

android 实现可以放大缩小的TextView

2013-07-14 18:38 411 查看
前言

我们在浏览网页时,网页的文本可以放大缩小,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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐