最近对Android开发很感兴趣,想弄明白用手指在手机屏幕上划动就能控制界面的技术,于是,参照一些资料,自己写了个测试程序,实现用两个手指划动来缩放View中文本的字体。
package com.pyh;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public abstract class ZoomView<V extends View> {
protected V view;
private boolean startTwoTouchPoint = false;
private double startDistance;
protected float zoomScale = 0.1f;
public ZoomView(V view, float scale) {
this.view = view;
this.zoomScale = scale;
setTouchListener();
}
private static double getDistance(double x1, double y1, double x2, double y2) {
return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
private void setTouchListener() {
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getPointerCount() == 2) {
if (startTwoTouchPoint == false) {
startDistance = getDistance(event.getX(0), event
.getY(0), event.getX(1), event.getY(1));
startTwoTouchPoint = true;
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
double distance = getDistance(event.getX(0), event
.getY(0), event.getX(1), event.getY(1));
if (distance > startDistance) {
zoomIn();
} else if (distance < startDistance) {
zoomOut();
}
view.invalidate();
}
} else {
startTwoTouchPoint = false;
}
return true;
}
});
}
protected abstract void zoomIn();
protected abstract void zoomOut();
}
package com.pyh;
import android.widget.TextView;
public class ZoomTextView extends ZoomView<TextView> {
public static final float MIN_TEXT_SIZE = 5.0f;
public static final float MAX_TEXT_SIZE = 200.0f;
public ZoomTextView(TextView view, float scale) {
super(view, scale);
}
@Override
protected void zoomOut() {
view.setTextSize(view.getTextSize() - zoomScale);
if (view.getTextSize() < MIN_TEXT_SIZE)
view.setTextSize(MIN_TEXT_SIZE);
}
@Override
protected void zoomIn() {
view.setTextSize(view.getTextSize() + zoomScale);
if (view.getTextSize() > MAX_TEXT_SIZE)
view.setTextSize(MAX_TEXT_SIZE);
}
}
本打算可以实现对各种View的子类都能缩放其文本字体,所以就有了ZoomTextView继承ZoomView的结构,以后也可能会有ZoomEditText、ZoomImageView......
用法如下:
public class MultiTouchActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView=(TextView)this.findViewById(R.id.text_view);
float zoomScale=0.5f;
new ZoomTextView(textView,zoomScale);
}
}