所以,我的一般问题是我试图动态设置imageButton图像基于抓取一个400 x 600 png Drawable的80 x 80区域,将它们分层,并将imageButton.setImageDrawable()它们放入按钮中。这实际上有效...假设设备有一个大屏幕。对于小屏幕(阅读:电话),这失败了。当然,我只测试了BlueStacks的“大屏幕”,但小屏幕上的故障影响了我的Nexus 5 emmulater,朋友的Turbo和我的新(可能是两个月大的)Turbo 2。
a Picture showing buttons with faces for BlueStacks but nothing for a Phone in the emmulator
至于Code ...以下是创建按钮的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”从reasources抓取drawables,使用setBounds抓取与你所看到的相对应的drawable的80 x 80区域(完整的drawables分层在上面,其他东西分层并添加,见左边 - 手形图像的大小差异感);这是来自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×80区域? (nFaceStartx,nFacex等是找到80乘80区域的界限)。如果没有,那么是什么原因造成的?我如何在代码中修复它?
修改:添加了一行 Log.e(“width”,Integer.toString(layerDrawable.getIntrinsicWidth())+“”+ Integer.toString(btnChoice [nN] .getWidth()));
..在Bluestacks(它工作的地方)吐出“width 80 50”,在手机模拟器上吐出“宽度80 150”,它不显示。不知道为什么会出现这种情况,但如果重要的话,那就是它。布局:宽度和布局:高度在xml中都是50dp。
答案 0 :(得分: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
答案 1 :(得分:0)
问题是Android中的图像重新调整大小(较小的屏幕意味着它缩小图像以适应...然后抓取图像中的区域/其中没有任何内容并使用它);将所有内容移动到名为“drawable-nodpi”的文件夹,并在显示时手动设置大小,解决了情况。