最新项目里需要开发一个根据记忆给图片上色的小游戏,在尝试了很多种方法后,效果都不尽如人意,随后看到鸿洋的一篇博客,采用layer-list来实现。
博客地址:Android 不规则图像填充 小玩着色游戏
查看其代码发现,在ColourImageBaseLayerView类中,使用的是图片原本的宽高作为视图的宽高的,所以在findDrawable这个方法里通过bitmap.getPixel((int) x, (int) y)这个方法获取到该图片的像素点是没有问题的,但在我这个项目中图片需要适配不同屏幕大小,所以上述方法获取到像素点就不对了,于是修改了一下代码,在此记录一下。修改代码如下
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mDrawables != null) {
int width = mDrawables.getIntrinsicWidth();
int height = mDrawables.getIntrinsicHeight();
int defWidth = Utils.getWidth(getContext()) - 90;//获取到默认最大宽度
int newWidth=width;
int newHeight=height;
if (width > defWidth) {//当图片宽度大于最大宽度时,并更具宽高比算出需要设置宽高
double mix = (double) width / (double) height;
newWidth= defWidth;
widthMix=(double) width/ (double) newWidth;//宽度缩放比
newHeight= (int) (width / mix);
heightMix=(double) height / (double) newHeight;//高度缩放比
}
setMeasuredDimension(newWidth, newHeight);
}else{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
private Drawable findDrawable(float x, float y) {
if (mDrawables!=null){
x = widthMix * x;//算出实际X坐标点
y = heightMix * y; //算出实际Y坐标点
final int numberOfLayers = mDrawables.getNumberOfLayers();
Drawable drawable;
Bitmap bitmap;
for (int i = numberOfLayers - 2; i >= 0; i--) {
drawable = mDrawables.getDrawable(i);
bitmap = ((BitmapDrawable) drawable).getBitmap();
try {
int pixel = bitmap.getPixel((int) x, (int) y);
if (pixel == Color.TRANSPARENT) {
continue;
}
} catch (Exception e) {
continue;
}
if (touchColorCallback!=null){
touchColorCallback.onTouchColor(i,color);
}
return drawable;
}
}
return null;
}