したがって、私の一般的な問題は、多数の 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 です。