美文网首页
Android 将本地资源图片转换成Drawable,进行设置大

Android 将本地资源图片转换成Drawable,进行设置大

作者: 欢乐的乐 | 来源:发表于2017-05-05 18:23 被阅读3626次

    前言:
    因为项目中显示图片是用Picasso,设置placeholder和error图片的时候发现,本地图片的大小无法满足我的需求,需要先对图片大小改变再显示。
    Picasso的placeholder和error的参数也只有int resIdDrawable drawable
    于是打算将改变过大小的Drawable传进入显示,咦,效果很满意!

    开心
    整个过程的思路:
    1. 将本地图片(R.drawable.image)变成Drawable对象
    2. 将Drawable对象转换成Bitmap对象
    3. 将Bitmap对象根据指定大小创建一个新的Bitmap对象
    4. 将Bitmap对象转换成Drawable对象
    代码:
    1. 将本地图片(R.drawable.image)变成Drawable对象

    Drawable drawable = ContextCompat.getDrawable(context, R.drawable.image);

    2. 将Drawable对象转换成Bitmap对象
    /**
     * 将Drawable转换为Bitmap
     * @param drawable
     * @return
     */
    private Bitmap drawableToBitmap(Drawable drawable) {
        //取drawable的宽高
        int width = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();
        //取drawable的颜色格式
        Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE 
                    ? Bitmap.Config.ARGB_8888
                    : Bitmap.Config.RGB_565;
       //创建对应的bitmap
        Bitmap bitmap = Bitmap.createBitmap(width, height, config);
        //创建对应的bitmap的画布
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, width, height);
        //把drawable内容画到画布中
        drawable.draw(canvas);
        return bitmap;
    }
    
    3. 整个流程的执行

    后来发现一个更简洁的方法

    /**
     * 将本地资源图片大小缩放
     * @param resId
     * @param w
     * @param h
     * @return
     */
     public Drawable zoomImage(int resId, int w, int h){
        Resources res = mContext.getResources();
        Bitmap oldBmp = BitmapFactory.decodeResource(res, resId);
        Bitmap newBmp = Bitmap.createScaledBitmap(oldBmp,w, h, true);
        Drawable drawable = new BitmapDrawable(res, newBmp);
        return drawable;
    }
    

    原来复杂的思路

    /**
     * 缩放Drawable
     *@drawable 原来的Drawable
     *@w 指定的宽
     *@h 指定的高
     */
    public Drawable zoomDrawable(Drawable drawable, int w, int h){
        //获取原来Drawable的宽高
        int width = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();
        //将Drawable转换成Bitmap
        Bitmap oldbmp = drawableToBitmap(drawable);
        //计算scale
        Matrix matrix = new Matrix();
        float scaleWidth = ((float)w/width);
        float scaleHeight = ((float)h/height);
        matrix.postScale(scaleWidth, scaleHeight);
        //生成新的Bitmap
        Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true);
        //设置bitmap转成drawable后尺寸不变 
        //这个很关键后面解释!!
        DisplayMetrics metrics = new DisplayMetrics();
        manager.getDefaultDisplay().getMetrics(metrics);
        Resources resources = new Resources(mContext.getAssets(), metrics, null);
        return new BitmapDrawable(resources, newbmp);
    }
    

    学习中遇到的问题

    看网上的教程是没有下面

    DisplayMetrics metrics = new DisplayMetrics();
    manager.getDefaultDisplay().getMetrics(metrics);
    Resources resources = new Resources(mContext.getAssets(), metrics, null);
    

    这段代码的。
    假如我指定的宽高是200,生成的Drawable的宽高却只有100。

    原来Bitmap转换成Drawable的尺寸是会变小的。

    那段代码就能解决尺寸变小的问题。
    如果路过的大神有更好的方法,希望能指点一下小白。


    好好学习,天天向上。<( ̄oo, ̄)/


    Potato_zero.jpg

    相关文章

      网友评论

          本文标题:Android 将本地资源图片转换成Drawable,进行设置大

          本文链接:https://www.haomeiwen.com/subject/alhstxtx.html