0

ゲーム用の Android カスタム コンポーネントを作成したいと考えています。基本的な考え方は、カスタム コンポーネントの形状が正方形で、その中に他の正方形の ImageView コンポーネントが含まれているというものです。内部の ImageView コンポーネントは、必要に応じて拡大または縮小できますが、正方形のままにする必要があります。行数 == 列、常に。難易度によって、実行時の行と列の正確な値が決まります。ゲームが難しくなるにつれて、行と列の数は等しく増加しますが、各 ImageView のスケーリングされたサイズはそれに応じて縮小します。ほとんどの場合、見栄えがよくなるように、コンポーネント間に一定の小さな間隔を置きたいと思います。ディスプレイはスクロールできません。すべてのアイテムが同時にディスプレイに収まる必要があります。

何度も失敗した後、私はイライラしてきており、このカスタム コンポーネントを作成するのが最善の方法であることがわかりません。

私の最新のアイデアは、おおよそ次のことを行うことです。

「FrameLayout を拡張」して、カスタム コンポーネント クラスを作成します。私のコンストラクターでは、任意の小さな正方形の ImageView オブジェクトをコードで作成します。いつか私のカスタム コンポーネントを他の人に再利用してもらいたいので、カスタム コンポーネントが外部 XML ドローアブルの定義に依存しないように、XML ではなくコードでそれを行います。ImageView が「直角」を維持するようにスケール タイプを設定します (fitStart が必要だと思いますか?)。正方形の ImageView の layout_width と layout_height を「fill_parent」に設定したため、ImageView は、含まれている FrameLayout で利用可能なスペースをできるだけ大きく埋めます。addView() を使用して、大きくて正方形の ImageView をレイアウトに追加します。

次に、RelativeLayout オブジェクトを作成し、addView() を使用してプログラムで自分自身に追加します。私の基本クラスは FrameLayout であるため、これにより RelativeLayout のサイズが以前に追加した正方形の ImageView と同じになると思います。少なくとも私はそのようにドキュメントを読みました。

次に、ImageView を測定して、その大きさを確認します。以前の試みがこれで失敗したため、自分自身を測定できるとは思いません。私は自分のサイズで0を取得し続けました。私の調査によると、これは建設中に自分自身を測定できないためです。これがCatch-22になりました。使用可能なスペースに合わせて画像を拡大しようとしたとき、まだ使用可能なスペースがなかったためできませんでした。私の希望は、FrameLayout を基本クラスとして使用するように変更し、そこに ImageView を追加したため、新しく作成され、正しくスケーリングされた大きな正方形の ImageView を測定できるようになることです。

すべてが計画どおりに進むと、ImageView と同じであるため、ユーザーのデバイスで RelativeLayout に使用できるスペースの大きさがわかります。使用可能なスペースの量と、表示する必要がある行と列の数を把握することで、追加する ImageView 間の間隔を考慮することを覚えていると仮定して、追加する各 ImageView を適切にスケーリングできます。これで、正方形の ImageView は不要になり、必要に応じて削除できます。

合理的であれば、大きな ImageView の角を丸くし、追加された各 ImageView も角を丸くしたいと思います。ImageViews の間に小さなギャップを追加すると、これはゲームプレイにとってクールに見えます。このように、背景として残すことができます。

これは良い解決策のようで、うまくいかなかった私の以前の試みよりも優れていますが、もっと良い方法があれば...、私は聞いています.

私の理解の範囲内で、上記とほとんど同じことを言っている疑似コードを次に示します。

コンストラクト()
{
    ImageView squareImageView = new ImageView(Square);
    LayoutParams squareImageLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    squareImageLayoutParams.addRule(fitStart);
    addView(squareImageView, squareImageLayoutParams);

    RelativeLayout relativeLayout = new RelativeLayout(context);
    LayoutParams relativeLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    addView(relativeLayout, relativeLayoutParams);

    int size = squareImageView.getWidth(); // スケーリングされたサイズと正方形でなければなりません。  
    squareImageView.setVisibility(INVISIBLE); // 多分?

    各行と列のループ
    {
        各画像をトリミング、スケーリングし、relativeLayout オブジェクトに追加します。  
    }
}

私の最も基本的な質問は、これが合理的な解決策のように見えるかどうかです。もしそうなら、疑似コードには(まだ)やり方がわからないことがたくさんあります。

  • コードで小さな正方形の ImageView を作成するにはどうすればよいですか?
  • コードで scaleType を設定するにはどうすればよいですか?
  • 正方形の ImageView を測定して正しいサイズを取得できますか?
  • 非表示にする以外に、正方形の ImageView を削除するより良い方法はありますか?
  • 正方形の ImageView を非表示にすると測定不能になりますか?
  • ShapeDrawable と呼ばれるものがありますが、これは正方形を作成するための ImageView よりも優れていますか?
  • ImageView を正方形にトリミングして、損失を両側に均等に分配するにはどうすればよいですか?

もちろん、これらすべての回答を知っている人はいないと思いますが、共有できる回答があれば教えていただければ幸いです。

ありがとう。

4

1 に答える 1

0

利用可能な画面スペースに適切にスケーリングするための多くの組み込み機能があります。sを測定する理由がよくわかりませんImageView

の使用を検討しましたweightか? 固定サイズGridView(またはTableLayout、またはs)LinearLayoutを試してみます。LinearLayout内容物がweight適切に編集されていれば、それらは「直角」を保持します。verticalSpacingまたはhorizontalSpacingの属性を使用することも、空白に配置するためにGridView空の を作成することもできます。Viewweight

親要素の属性を設定しないでくださいweightsum。ただし、水平方向の要素の重みの合計が垂直方向の合計と同じであることを確認してください。そこに含まれる要素の数に関係なく、正方形の ImageViews は常に適切にスケーリングされます。

于 2011-05-24T09:47:43.513 に答える