我必须遗漏一些显而易见的东西,因为这个星球上的每个人似乎都能够完成整个缩放的工作。主要的区别是大多数人似乎在放大图像,而我有一堆GridLayout(android-support-v7-gridlayout)和一堆文本视图。目标似乎很简单:允许用户放大,以便他们可以以更大的尺寸查看整个网格的一部分。
网格画得精细,横向和水平。垂直滚动工作正常。然后,当我用手指分开(缩放)做双指手势时,尽管获得了onScale被调用的日志消息,但没有任何反应。当我将两个手指移入(捏合)时,所有视图都会消失(尽管我的滚动条已经离开)。
我看过Matrix转换,但没有看到那些除了图像视图以外的任何工作。
基本布局xml:
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<HorizontalScrollView
android:id="@+id/chooser_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</HorizontalScrollView>
</ScrollView>
然后在活动中
private ZoomGridLayout playerGrid;
并在onCreate:
ViewGroup gridParent = (ViewGroup) findViewById(R.id.chooser_layout);
playerGrid = new ZoomGridLayout(getBaseContext());
playerGrid.setRowCount(8);
playerGrid.setColumnCount(8);
LayoutParams layout =
new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
playerGrid.setDetector();
gridParent.addView(playerGrid, layout);
然后我继续向网格添加~150个小文本视图。 这是ZoomGridLayout的第一次拍摄:
public class ZoomGridLayout extends GridLayout {
private final static String TAG = "ZGL";
private ScaleGestureDetector scaleDetector;
private Context context;
public void setDetector() {
scaleDetector = new ScaleGestureDetector(context, new ScaleGesture());
}
public ZoomGridLayout(Context c) {
super(c);
context = c;
}
@Override
public boolean onTouchEvent (MotionEvent event) {
scaleDetector.onTouchEvent(event);
return true;
}
private class ScaleGesture
extends ScaleGestureDetector.SimpleOnScaleGestureListener
{
@Override
public boolean onScale(ScaleGestureDetector detector) {
Log.v(TAG, detector.toString());
ScaleAnimation scale =
new ScaleAnimation(detector.getPreviousSpan(),
detector.getCurrentSpan(),
detector.getPreviousSpan(),
detector.getCurrentSpan());
scale.setFillAfter(true);
startAnimation(scale);
return true;
}
}
}
我几天来一直在反对这一点。我是Android编程的新手,所以不太熟悉这些库,但我是一位经验丰富的开发人员。任何指针都会很精彩。 TIA。
答案 0 :(得分:0)
我放弃了动画(虽然最终我想尝试做到这一点)。这是新的onScale方法:
@Override
public boolean onScale(ScaleGestureDetector detector) {
Log.v(TAG, detector.toString());
mScaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
mScaleFactor = Math.max(MIN_SCALE, Math.min(mScaleFactor, MAX_SCALE));
invalidate();
return true;
}
然后通过覆盖draw方法来补充:
@Override
public void dispatchDraw(Canvas canvas) {
String disp = String.valueOf(mScaleFactor);
Log.v(TAG, "dispatch draw " + disp);
canvas.save();
canvas.scale(mScaleFactor, mScaleFactor);
super.dispatchDraw(canvas);
canvas.restore();
}
我还了解到,由于父级是ViewGroup而不是View,因此需要覆盖dispatch ...方法而不是on ...方法。
这种模式有很多不同的变体。我希望这种特殊的皱纹可以帮助别人。