所以,我的一般问题是我正在尝试基于抓取多个 400 x 600 png Drawable 的 80 x 80 区域来动态设置 imageButton 图像,将它们分层,并将 imageButton.setImageDrawable() 它们放入按钮中。这实际上有效......假设设备有一个大屏幕。对于小屏幕(阅读:电话),这会失败。诚然,我只测试了 BlueStacks 的“大屏幕”,但是小屏幕上的失败影响了我的 Nexus 5 仿真器、朋友的 Turbo 和我的新的(可能是两个月大的)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();
所以,我的问题是......为什么这在大屏幕上有效,但在小屏幕上却如此糟糕?一个不同的按钮(1个Drawable)也有类似的问题,它只显示了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(它工作的地方)上吐出“width 80 50”,在电话模拟器上吐出“width 80 150”,它不显示。不知道为什么会发生这种情况,但它确实存在,以防万一。layout:width 和 layout:height 在 xml 中都是 50dp。