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

这篇博客介绍了如何在Android项目中开发一个根据记忆给图片上色的游戏。作者遇到了在不同屏幕尺寸下图片填充的问题,原有的方法无法正确获取像素点。为了解决这个问题,作者修改了代码,通过计算宽度和高度的缩放比例,确保图片在不同屏幕大小下能正确填充并获取像素点。在`onMeasure`方法中调整了视图尺寸,并在`findDrawable`方法中应用了缩放比例来获取正确的坐标点。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值