1. ホーム
  2. android

[解決済み] イメージビューのスケーリング TOP_CROP

2023-02-28 13:23:04

質問

私は ImageView があり、デバイスのアスペクト比よりも大きな png を表示しています (垂直方向に長いということです)。アスペクト比を維持し、親の幅に合わせ、イメージビューを画面の上部に固定しながら、これを表示したいのです。

を使用する際の問題点は CENTER_CROP を使用した場合の問題は、画像ビューの上端に上端を揃えるのではなく、スケーリングされた画像を中央に配置することです(理解できる)。

の問題点は FIT_START の問題は、画像が画面の高さにフィットし、幅を埋めないことです。

私はこの問題を、カスタムのImageViewを使用して onDraw(Canvas) をオーバーライドし、canvas を使用して手動でこれを処理することで解決しました。このアプローチの問題は、1) もっと簡単なソリューションがあるのではないかと心配していること、2) super(AttributeSet) を呼び出したときに、ヒープに 3 mb の空き領域 (ヒープ サイズは 6 mb) があるのに、330kb の src img を設定しようとすると、VM メモリ例外が発生し、原因を突き止められません。

どんなアイデア/提案/解決策も大歓迎です :)

ありがとうございます。

p.s. 解決策として、マトリクススケールタイプを使用して自分で行うことも可能かと思いましたが、それは現在の解決策と同じかそれ以上の作業となるようです!

どのように解決するのですか?

OK、私は作業ソリューションを持っています。Darkoからのプロンプトは、私にImageViewクラスをもう一度見させました(感謝)、そして、マトリックスを使用して変換を適用しました(私が最初に疑ったように、しかし私の最初の試みで成功しませんでした!)。私のカスタムImageViewクラスで、私は以下を呼び出します。 setScaleType(ScaleType.MATRIX) の後に super() をコンストラクタに追加し、以下のメソッドを用意します。

    @Override
    protected boolean setFrame(int l, int t, int r, int b)
    {
        Matrix matrix = getImageMatrix(); 
        float scaleFactor = getWidth()/(float)getDrawable().getIntrinsicWidth();    
        matrix.setScale(scaleFactor, scaleFactor, 0, 0);
        setImageMatrix(matrix);
        return super.setFrame(l, t, r, b);
    }

の中にintを置きました。 setFrame() メソッドに配置しました。 configureBounds() の呼び出しはこのメソッド内で行われ、そこではすべてのスケーリングとマトリックスが行われるので、私には論理的に見えます(反対なら言ってください)。

以下は super.setFrame() メソッドを AOSP (Android Open Source Project) から引用しています。

    @Override
    protected boolean setFrame(int l, int t, int r, int b) {
        boolean changed = super.setFrame(l, t, r, b);
        mHaveFrame = true;
        configureBounds();
        return changed;
    }

フルクラスのsrcを見つける はこちら