• android 图片叠加效果——两种方法的简介与内容 ,带解决Immutable bitmap passed to Canvas constructor错误


    第一种是通过canvas画出来的效果:

    1. public void first(View v) {  
    2.   
    3.         // 防止出现Immutable bitmap passed to Canvas constructor错误  
    4.         Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),  
    5.                 R.drawable.apple).copy(Bitmap.Config.ARGB_8888, true);  
    6.         Bitmap bitmap2 = ((BitmapDrawable) getResources().getDrawable(  
    7.                 R.drawable.go)).getBitmap();  
    8.   
    9.         Bitmap newBitmap = null;  
    10.   
    11.         newBitmap = Bitmap.createBitmap(bitmap1);  
    12.         Canvas canvas = new Canvas(newBitmap);  
    13.         Paint paint = new Paint();  
    14.   
    15.         int w = bitmap1.getWidth();  
    16.         int h = bitmap1.getHeight();  
    17.   
    18.         int w_2 = bitmap2.getWidth();  
    19.         int h_2 = bitmap2.getHeight();  
    20.   
    21.         paint.setColor(Color.GRAY);  
    22.         paint.setAlpha(125);  
    23.         canvas.drawRect(0, 0, bitmap1.getWidth(), bitmap1.getHeight(), paint);  
    24.   
    25.         paint = new Paint();  
    26.         canvas.drawBitmap(bitmap2, Math.abs(w - w_2) / 2,  
    27.                 Math.abs(h - h_2) / 2, paint);  
    28.         canvas.save(Canvas.ALL_SAVE_FLAG);  
    29.         // 存储新合成的图片  
    30.         canvas.restore();  
    31.   
    32.         image.setImageBitmap(newBitmap);  
    33.     }  
    public void first(View v) {
    
            // 防止出现Immutable bitmap passed to Canvas constructor错误
            Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),
                    R.drawable.apple).copy(Bitmap.Config.ARGB_8888, true);
            Bitmap bitmap2 = ((BitmapDrawable) getResources().getDrawable(
                    R.drawable.go)).getBitmap();
    
            Bitmap newBitmap = null;
    
            newBitmap = Bitmap.createBitmap(bitmap1);
            Canvas canvas = new Canvas(newBitmap);
            Paint paint = new Paint();
    
            int w = bitmap1.getWidth();
            int h = bitmap1.getHeight();
    
            int w_2 = bitmap2.getWidth();
            int h_2 = bitmap2.getHeight();
    
            paint.setColor(Color.GRAY);
            paint.setAlpha(125);
            canvas.drawRect(0, 0, bitmap1.getWidth(), bitmap1.getHeight(), paint);
    
            paint = new Paint();
            canvas.drawBitmap(bitmap2, Math.abs(w - w_2) / 2,
                    Math.abs(h - h_2) / 2, paint);
            canvas.save(Canvas.ALL_SAVE_FLAG);
            // 存储新合成的图片
            canvas.restore();
    
            image.setImageBitmap(newBitmap);
        }
    
     

    Canvas canvas = new Canvas(newBitmap); 当以newBitmap创建Canvas时,所以操作都已经在该图上实现了。

    该例子可以想做是播放器开始播放的效果,计算好中间位置,先覆盖一层透明灰色的正方形,然后在中间画上自己播放的按钮。

    第二种是使用系统的LayerDrawable类,该类主要用来控制多个图片的结合:

    1. public void second(View v) {  
    2.   
    3.         Bitmap bitmap1 = ((BitmapDrawable) getResources().getDrawable(  
    4.                 R.drawable.apple)).getBitmap();  
    5.         Bitmap bitmap2 = ((BitmapDrawable) getResources().getDrawable(  
    6.                 R.drawable.go)).getBitmap();  
    7.   
    8.         Drawable[] array = new Drawable[2];  
    9.         array[0] = new BitmapDrawable(bitmap1);  
    10.         array[1] = new BitmapDrawable(bitmap2);  
    11.         LayerDrawable la = new LayerDrawable(array);  
    12.         // 其中第一个参数为层的索引号,后面的四个参数分别为left、top、right和bottom  
    13.         la.setLayerInset(0, 0, 0, 0, 0);  
    14.         la.setLayerInset(1, 20, 20, 20, 20);  
    15.         image.setImageDrawable(la);  
    16.     }  
    public void second(View v) {
    
            Bitmap bitmap1 = ((BitmapDrawable) getResources().getDrawable(
                    R.drawable.apple)).getBitmap();
            Bitmap bitmap2 = ((BitmapDrawable) getResources().getDrawable(
                    R.drawable.go)).getBitmap();
    
            Drawable[] array = new Drawable[2];
            array[0] = new BitmapDrawable(bitmap1);
            array[1] = new BitmapDrawable(bitmap2);
            LayerDrawable la = new LayerDrawable(array);
            // 其中第一个参数为层的索引号,后面的四个参数分别为left、top、right和bottom
            la.setLayerInset(0, 0, 0, 0, 0);
            la.setLayerInset(1, 20, 20, 20, 20);
            image.setImageDrawable(la);
        }
    

    关联数组array,控制每一层的位置

     装载自:http://blog.csdn.net/gh102/article/details/6719624

    注意:上面防止出现Immutable bitmap passed to Canvas constructor错误

    原因是如果不用copy的方法,直接引用会对资源文件进行修改,而android是不允许在代码里修改res文件里的图片

  • 相关阅读:
    Win32中安全的子类化(翻译)
    OJ题目JAVA与C运行效率对比
    关协同过滤
    Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录
    GDI+简单现实文字旋转
    opencv 2.46与visual studio 2012 配置方法
    Emacs助力PowerShell
    ARC forbids explicit message send of 'autorelease'错误
    Event处理
    复制中发布服务器和订阅服务器内容不一致的解决办法
  • 原文地址:https://www.cnblogs.com/wu-yun-jiang/p/4375258.html
Copyright © 2020-2023  润新知