0

地球上の誰もがピンチズームのすべてを機能させることができるように見えるので、私は明らかな何かを見逃しているに違いありません. 主な違いは、ほとんどの人が画像をズームしているように見えるのに対し、私は一連のテキスト ビューを含む GridLayout (android-support-v7-gridlayout) を使用していることです。目標は単純に思えます: ユーザーがズームインできるようにして、フル グリッドの一部をより大きなサイズで表示できるようにすることです。

グリッドはきれいに描画され、水平および垂直スクロールは正常に機能します。次に、指を離して 2 本指のジェスチャー (ズーム) を実行すると、onScale が呼び出されたというログ メッセージが表示されますが、何も起こりません。2 本の指を動かすと (ピンチ)、すべてのビューが消えます (ただし、スクロール バーは残ります)。

私はマトリックス変換を見てきましたが、それらが画像ビュー以外で機能することを見ていません。

基本的なレイアウト 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 プログラミングは初めてなので、ライブラリにはあまり詳しくありませんが、経験豊富な開発者です。どんな指針も素晴らしいでしょう。ティア。

4

1 に答える 1

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();
    }

また、親は View ではなく ViewGroup であるため、on… メソッドではなく、dispatch… メソッドをオーバーライドする必要があることも知りました。

このパターンには非常に多くの異なるバリエーションがあります。この特定のしわが他の誰かを助けることを願っています.

于 2014-03-04T14:35:57.147 に答える