我目前正在开发一个小型Android应用程序,以熟悉API。但是,我在使用createBitmap时遇到了关于子像素数据的问题。我目前有这些代码块。 (注意:正在读入的图像是128x128 RGB565 jpeg):
public class MainMenu extends View {
private int vWidth; // Width of our view
private int vHeight; // Height of our view
private Bitmap imgButtons;
private Rect rect;
private MenuItem testButton;
private MenuItem testButton2;
public MainMenu(Context context) {
super(context);
// Get our view dimensions
vWidth = getWidth();
vHeight = getHeight();
// Load our menu buttons' image
BitmapFactory.Options imgOptions = new BitmapFactory.Options();
imgButtons = BitmapFactory.decodeResource(getResources(), R.drawable.mainmenubuttons, imgOptions);
rect = new Rect(100, 400, 228, 528);
// Create our menu buttons and load their specific images
testButton = new MenuItem(100, 50);
testButton2 = new MenuItem(100, 200);
testButton.LoadImage(imgButtons, 128, 64, 0, 0);
testButton2.LoadImage(imgButtons, 128, 64, 0, 64);
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawBitmap(imgButtons, null, rect, null);
testButton.Draw(canvas);
testButton2.Draw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() != MotionEvent.ACTION_DOWN)
super.onTouchEvent(event);
return true;
}
}
class MenuItem {
private int xPos; // Center x-coordinate
private int yPos; // Center y-coordinate
private int width; // Button width
private int height; // Button height
private Rect rect;
private Bitmap buttonImage;
public MenuItem(int withXPos, int withYPos) {
xPos = withXPos;
yPos = withYPos;
}
public void LoadImage(Bitmap image, int imageWidth, int imageHeight, int xOffset, int yOffset) {
width = imageWidth;
height = imageHeight;
buttonImage = Bitmap.createBitmap(image, xOffset, yOffset, width, height);
rect = new Rect(xPos - (width >> 1), yPos - (height >> 1),
xPos + (width >> 1), yPos + (height >> 1));
}
public void Draw(Canvas canvas) {
canvas.drawBitmap(buttonImage, null, rect, null);
}
}
下面是显示问题的图片:
我撒了谎。我还不允许发布图片,所以这里是图片的链接: createBitmap issues那么,为什么我可以正确显示原始图像,但无法正确显示从其子像素数据创建的图像?我使用版本2.1到3.0运行应用程序,3.0没有问题正确显示图像。它只是版本3.0之前的设备问题,还是我错过了什么?我发现了一篇关于堆叠描述使用的实体图像(RBG565)和包含alpha(ARGB8888)的图像之间问题的文章。其中,如果图像是ARGB8888类型,我的方法将不起作用,如果是这样,我需要物理处理像素数据并自己复制子像素数据并创建我自己的像素缓冲区来存储该数据。我一时兴起试过这件事,这让我陷入了同样的问题。我只想到为什么不试试呢?我也试过Bitmap.createBitmap的其他变种无济于事。在这一点上,我有点难过,并想到我会问社区。 p>