0

したがって、私の一般的な問題は、多数の 400 x 600 png Drawable の 80 x 80 領域を取得し、それらをレイヤー化し、imageButton.setImageDrawable() をボタンに入れることに基づいて、imageButton 画像を動的に設定しようとしていることです。これは実際に機能します...デバイスの画面が大きいと仮定します。小さな画面 (読み取り: 電話) の場合、これは失敗します。確かに、私は BlueStacks の「大画面」のみをテストしましたが、小画面での失敗は、Nexus 5 エミュレーター、友人の Turbo、および新しい (おそらく 2 か月前の) Turbo 2 に影響を与えました。

エミュレーターで BlueStacks の顔があり、電話のボタンがないことを示す画像

コードについては...以下は、ボタンを作成する for ループの内部です。

Drawable[] layers = new Drawable[8];
                    faceMaker(layers);
                    layers[1] = changeColor(layers[1], Color.parseColor("#" + listChoice.get(nN -1 + nAdd).toString().substring(1, 7)));
                    layers[2] = changeColor(layers[2], Color.parseColor(CharacterDatabase.getColor(156)));
                    layers[3] = changeColor(layers[3], Color.parseColor(CharacterDatabase.getColor(155)));
                    layers[4] = changeColor(layers[4], Color.parseColor("#" + listChoice.get(nN -1 + nAdd).toString().substring(1, 7)));
                    layers[5] = changeColor(layers[5], Color.parseColor("#" + listChoice.get(nN -1 + nAdd).toString().substring(1, 7)));
                    layers[6] = changeColor(layers[6], Color.parseColor(CharacterDatabase.getColor(155)));
                    layers[7] = changeColor(layers[7], Color.parseColor(CharacterDatabase.getColor(155)));
                    layers[0] = changeColor(layers[0], Color.parseColor(CharacterDatabase.getColor(155)));
                    LayerDrawable layerDrawable = new LayerDrawable(layers);
                    btnChoice[nN].setImageDrawable(layerDrawable);
                    nBtnAct[nN] = 1;

「faceMaker」がリソースからドローアブルを取得する場合、setBounds を使用して、表示されるものに対応するドローアブルの 80 x 80 の領域を取得します (完全なドローアブルが上にレイヤー化され、他のものがレイヤー化されて追加されます。左側の画像を参照してください)サイズ感の違い); faceMaker() のサンプルは次のとおりです。

int id = imgApp.getContext().getResources().getIdentifier(sSex.substring(0, 1) + "hair" + Integer.toString(CharacterDatabase.getSlot(7)), "drawable", imgApp.getContext().getPackageName());
    layers[0] = ContextCompat.getDrawable(imgApp.getContext(), id).mutate();
    layers[0] = new BitmapDrawable(imgApp.getContext().getResources(), Bitmap.createBitmap(((BitmapDrawable) layers[0]).getBitmap(),   nFaceStartX, nFaceStartY, nFaceX, nFaceY));
    layers[0].mutate();

それで、私の質問は...なぜこれは大きな画面では機能するのに、小さな画面ではひどく失敗するのですか? Drawableの一部のみを表示していた別のボタン(1つのDrawable)で同様の問題がありました。それを解決するために setBounds の問題を修正しましたが、ボタンの頭だけをつかむ必要があるため、faceMaker/ボタン ソリューション全体では機能しません。

これは setBounds の問題ですか? もしそうなら、どうすればそれを解決し、それでも必要な 80 x 80 の領域を取得できますか? (nFaceStartx、nFacex などは、80 x 80 の領域を見つける境界です)。そうでない場合、何が原因ですか?そして、コードでそれを修正するにはどうすればよいですか?

編集:行を追加 Log.e("width", Integer.toString(layerDrawable.getIntrinsicWidth()) + " " + Integer.toString(btnChoice[nN].getWidth()));

..Bluestacks(動作する場所)では「幅80 50」、表示されない電話エミュレーターでは「幅80 150」を吐き出します。なぜそれが起こっているのかはわかりませんが、問題が発生した場合に備えて、そこにあります. xml では、layout:width と layout:height はどちらも 50 dp です。

4

2 に答える 2

0

6.0 の問題に関連している可能性があります。次のエラー メッセージも表示されます。

05-31 10:10:49.237 2419-2448/neverforged.neverforgedroleplayinggame E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa1f84a70
05-31 10:10:57.808 2419-2448/neverforged.neverforgedroleplayinggame E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa1f84d10
05-31 10:11:09.134 2419-2448/neverforged.neverforgedroleplayinggame E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa1f82770
05-31 10:11:20.982 2419-2448/neverforged.neverforgedroleplayinggame E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa1f822a0
05-31 10:15:49.477 2419-2448/neverforged.neverforgedroleplayinggame E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa1f83730
于 2016-05-31T14:23:37.207 に答える
0

問題はAndroidでの画像のサイズ変更です(画面が小さいということは、画像が収まるように縮小されることを意味します...次に、画像から離れた領域/何もない領域を取得してそれを使用します)。すべてを「drawable-nodpi」という名前のフォルダーに移動し、表示時に手動でサイズを設定すると、状況は解決しました。

ここで見つけたので、これが起こっていることに気づきました

于 2016-06-03T13:16:12.647 に答える