有什么方法可以在编辑文本时添加捏合放大缩小功能吗?
虽然这是有点奇怪的用户交互,但我相信只需结合一些简单的视图手势识别和更改字体大小就应该可以完成。您可以首先创建自定义
EditText
并重写 onTouchEvent(MotionEvent)
方法。在 onTouchEvent(MotionEvent)
中,您可以使用 ScaleGestureDetector
(更多信息此处)来检测“捏合缩放”手势。另请参阅此 Android guide,了解有关在视图中实现自定义手势检测的更多信息。
检测到缩放手势后,您可以简单地使用
setTextSize
中的 EditText
来调整相对于缩放变化的字体大小。这当然不会为您提供像在网站上缩放那样的“平滑”缩放手势。您可以尝试的另一种方法是采取缩放手势并物理调整 EditText
的大小(宽度和高度),但这只是一个想法。希望这有帮助!
super.onTouchEvent(event);
,这样您就不会丢失 EditText 属性
final static float move = 200;
float ratio = 1.0f;
int bastDst;
float baseratio;
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (event.getPointerCount() == 2) {
int action = event.getAction();
int mainaction = action & MotionEvent.ACTION_MASK;
if (mainaction == MotionEvent.ACTION_POINTER_DOWN) {
bastDst = getDistance(event);
baseratio = ratio;
} else {
// if ACTION_POINTER_UP then after finding the distance
// we will increase the text size by 15
float scale = (getDistance(event) - bastDst) / move;
float factor = (float) Math.pow(2, scale);
ratio = Math.min(1024.0f, Math.max(0.1f, baseratio * factor));
text.setTextSize(ratio + 15);
}
}
return true;
}
// get distance between the touch event
private int getDistance(MotionEvent event) {
int dx = (int) (event.getX(0) - event.getX(1));
int dy = (int) (event.getY(0) - event.getY(1));
return (int) Math.sqrt(dx * dx + dy * dy);
}
您必须创建自定义编辑文本和工具
ScaleGestureDetector.OnScaleGestureListener
。
xt 可能看起来像那样
public class MyEditText extends EditText implements ScaleGestureDetector.OnScaleGestureListener {
private float textSize=14f;
private float maxTextSize=40f;
private float minTextSize=5f;
private ScaleGestureDetector sgdetector;
public MyEditText(Context context,AttributeSet attr){
super(context,attr);
sgdetector=new ScaleGestureDetector(context,this);
sgdetector.setQuickScaleEnabled(true);
}
@Override
public boolean onScale(ScaleGestureDetector gesture) {
float prs = gesture.getPreviousSpan();
float spn = gesture.getCurrentSpan();
float spt = gesture.getScaleFactor();
if(prs>spn){
textSize-=spt;
textSize = Math.max(textSize,minTextSize);
}else{
textSize+=spt;
textSize = Math.min(textSize,maxTextSize);
}
setTextSize(textSize);
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector gesture) {
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector gesture) {
}
@Override
public boolean onTouchEvent(MotionEvent event) {
sgdetector.onTouchEvent(event);
return sgdetector.isInProgress() ? true : super.onTouchEvent(event);
}}