我的布局包含按钮、文本视图等。是否可以在我的布局中实现捏缩放?
7 回答
对于 android 2.2+ (api level8),您可以使用 ScaleGestureDetector。
你需要一个会员:
private ScaleGestureDetector mScaleDetector;
在您的构造函数(或 onCreate())中添加:
mScaleDetector = new ScaleGestureDetector(context, new OnScaleGestureListener() {
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return true;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
Log.d(LOG_KEY, "zoom ongoing, scale: " + detector.getScaleFactor());
return false;
}
});
您覆盖 onTouchEvent:
@Override
public boolean onTouchEvent(MotionEvent event) {
mScaleDetector.onTouchEvent(event);
return true;
}
如果您手动绘制视图,您可能在 onScale() 中将比例因子存储在成员中,然后调用 invalidate() 并在绘制 onDraw() 时使用比例因子。否则,您可以直接在 onScale() 中修改字体大小或类似的内容。
我TextView
使用本教程为我的 实现了捏缩放。结果代码是这样的:
private GestureDetector gestureDetector;
private View.OnTouchListener gestureListener;
在 onCreate() 中:
// Zoom handlers
gestureDetector = new GestureDetector(new MyGestureDetector());
gestureListener = new View.OnTouchListener() {
// We can be in one of these 2 states
static final int NONE = 0;
static final int ZOOM = 1;
int mode = NONE;
static final int MIN_FONT_SIZE = 10;
static final int MAX_FONT_SIZE = 50;
float oldDist = 1f;
@Override
public boolean onTouch(View v, MotionEvent event) {
TextView textView = (TextView) findViewById(R.id.text);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
mode = ZOOM;
Log.d(TAG, "mode=ZOOM" );
}
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mode == ZOOM) {
float newDist = spacing(event);
// If you want to tweak font scaling, this is the place to go.
if (newDist > 10f) {
float scale = newDist / oldDist;
if (scale > 1) {
scale = 1.1f;
} else if (scale < 1) {
scale = 0.95f;
}
float currentSize = textView.getTextSize() * scale;
if ((currentSize < MAX_FONT_SIZE && currentSize > MIN_FONT_SIZE)
||(currentSize >= MAX_FONT_SIZE && scale < 1)
|| (currentSize <= MIN_FONT_SIZE && scale > 1)) {
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, currentSize);
}
}
}
break;
}
return false;
}
魔术常数 1.1 和 0.95 是根据经验选择的(scale
为此使用变量使我的TextView
行为有点奇怪)。
还有这个项目可以完成这项工作并为我完美地工作: https ://github.com/chrisbanes/PhotoView
我创建了一个支持 Android 2.1+ 的基本捏合缩放项目
在这里可用
我有一个非常好的开源库。这是一个四手势库,带有开箱即用的平移缩放设置。您可以在这里找到它:https ://bitbucket.org/warwick/hacergestov3 或者您可以在这里下载演示应用程序:https: //play.google.com/store/apps/details?id=com.WarwickWestonWright.HacerGestoV3Demo 这个是一个纯画布库,因此几乎可以在任何场景中使用。希望这可以帮助。