Android 关于不规则图像涂鸦问题记录

最新项目里需要开发一个根据记忆给图片上色的小游戏,在尝试了很多种方法后,效果都不尽如人意,随后看到鸿洋的一篇博客,采用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;
    }

你可能感兴趣的:(Android自定义控件,我的Android之路,android)