複雑なレイアウトのアプリに取り組んできました。最近、レイアウトの一部またはすべてをズーム可能にする必要があることに気付きました。
メインの xml ファイルの 1 つに、ビューを適切に配置するために複数のレイアウトがネストされた線形レイアウトがあります。この線形レイアウトとその中のすべてをズーム可能にする簡単な方法はありますか? それとも、レイアウト ファイル全体をズーム可能にする方が簡単でしょうか? 私のオプションは何ですか?
複雑なレイアウトのアプリに取り組んできました。最近、レイアウトの一部またはすべてをズーム可能にする必要があることに気付きました。
メインの xml ファイルの 1 つに、ビューを適切に配置するために複数のレイアウトがネストされた線形レイアウトがあります。この線形レイアウトとその中のすべてをズーム可能にする簡単な方法はありますか? それとも、レイアウト ファイル全体をズーム可能にする方が簡単でしょうか? 私のオプションは何ですか?
まず、その特定のビューでそのクラスを拡張します
public class MyImageView extends ImageView{
次のメソッドをオーバーライドします。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.scale(mScaleFactor, mScaleFactor, midPoint.x, midPoint.y);
if(appInitialized) {
hsSide.draw(canvas);
scaleA.draw(canvas);
scaleB.draw(canvas);
}
canvas.restore();
}
ズームされたオブジェクトのサイズを検出するジェスチャー検出器を作成し、オーバーラップを避けるために制限できます。
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
pivotX = detector.getFocusX();
pivotY = detector.getFocusY();
// Don't let the object get too small or too large.
mScaleFactor = Math.max(0.8f, Math.min(mScaleFactor, 2.0f));
invalidate();
return true;
}
}
最後にオブジェクトを初期化します
ScaleGestureDetector mScaleDetector;
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
静的変換を見たことがあるかもしれません。いずれViewGroup
かまたはサブクラスをカスタマイズして、その子ビューに変換を適用できます。これを有効にするには、 を呼び出してから、カスタムでコールバック (ドキュメント リンク) をsetStaticTransformationsEnabled(true)
オーバーライドします。ズーム効果を作成するためのスケールなど、任意の変換を適用できます。このコールバックは、ビューを再描画する必要があるか無効化されるたびに呼び出されます。getChildStaticTransformation()
ViewGroup
また、これをハードウェア アクセラレーションと併用する場合は注意してください。変換を更新する必要がある頻度によっては、ハードウェアが期待どおりに再描画できない場合があります。その場合、このビュー階層のソフトウェア レイヤーを有効にする必要があります。