android 画布叠加,Android实现图片叠加效果的两种方法
本文实例讲述了Android实现图片叠加效果的两种方法。分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // 防止出现Immutable bitmap passed to Canvas constructor错误 Bitmap bi
本文实例讲述了Android实现图片叠加效果的两种方法。分享给大家供大家参考,具体如下:
效果图:
第一种:
第二种:
第一种是通过canvas画出来的效果:
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类,该类主要用来控制多个图片的结合:
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,控制每一层的位置
注意:上面防止出现Immutable bitmap passed to Canvas constructor错误
原因是如果不用copy的方法,直接引用会对资源文件进行修改,而Android是不允许在代码里修改res文件里的图片
layer-list可以将多个图片按照顺序层叠起来。
语法:在drawalbe/drawable-layer.xml中
使用方式像其他图片一样:
如在样式中引用:
@drawable/drawable-layer
在java代码中引用:
复制代码 代码如下:((ImageView) findViewById(R.id.imageview)).setImageDrawable(getResources().getDrawable(R.drawable.drawable-layer)
在代码中实现:
Resources resources = getResources();
Drawable[] layers = new Drawable[2];
layers[0] = r.getDrawable(R.drawable.white);
layers[1] = r.getDrawable(R.drawable.logo_overlay);
LayerDrawable layerDrawable = new LayerDrawable(layers)
((ImageView) findViewById(R.id.imageview)).setImageDrawable(layerDrawable);
再举一个例子:
要用2张图片叠加起来,看上去形成一张图片
首先创建一个drawalbe/login_head.xml的文件,内容如下:
xmlns:Android="http://schemas.android.com/apk/res/android">
然后就可以使用这个组合的图片了,比如在ImageView中显示:
Android:layout_width="wrap_content" android:layout_height="wrap_content" />
使用java代码:
如何使多个Drawable叠加(合成图片)?
大家可能知道Bitmap的叠加处理在Android平台中可以通过Canvas一层一层的画就行了,而Drawable中如何处理呢? 除了使用BitmapDrawable的getBitmap方法将Drawable转换为Bitmap外,今天Android123给大家说下好用简单的LayerDrawable类,LayerDrawable顾名思义就是层图形对象。下面直接用一个简单的代码表示:
Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.cwj);
Drawable[] array = new Drawable[3];
array[0] = new PaintDrawable(Color.BLACK); //黑色
array[1] = new PaintDrawable(Color.WHITE); //白色
array[2] = new BitmapDrawable(bm); //位图资源
LayerDrawable ld = new LayerDrawable(array); //参数为上面的Drawable数组
ld.setLayerInset(1, 1, 1, 1, 1); //第一个参数1代表数组的第二个元素,为白色
ld.setLayerInset(2, 2, 2, 2, 2); //第一个参数2代表数组的第三个元素,为位图资源
mImageView.setImageDrawable(ld);
上面的方法中LayerDrawable是关键,Android开发网提示setLayerInset方法原型为public void setLayerInset (int index, int l, int t, int r, int b) 其中第一个参数为层的索引号,后面的四个参数分别为left、top、right和bottom。对于简单的图片合成我们可以将第一和第二层的PaintDrawable换成BitmapDrawable即可实现简单的图片合成。
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
android 画布叠加,Android实现图片叠加效果的两种方法相关推荐
- android 图片叠加xml,Android实现图片叠加效果的两种方法
本文实例讲述了Android实现图片叠加效果的两种方法.,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // ...
- android fragment传递参数_fragment之间传值的两种方法
在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...
- qt 加载 图片旋转_QT 实现图片旋转的两种方法
第一种方案 使用 QPixmap 的 transformed 函数来实现旋转,这个函数默认是以图片中心为旋转点,不能设置旋转的中心点,使用如下: QMatrix matrix; matrix.rota ...
- pytorch加载自己的图片数据集的两种方法
目录 ImageFolder 加载数据集 使用pytorch提供的Dataset类创建自己的数据集. Dataset加载数据集 接下来我们就可以构建我们的网络架构: 训练我们的网络: 保存网络模型(这 ...
- D3D中2D图片的绘制两种方法
2014/09/19 (转载自:http://blog.csdn.net/rabbit729/article/details/6388703) 想要在D3D中加载2D图片可以使用如下两种方法(我只想到 ...
- java 图片压缩100k_Java 实现图片压缩的两种方法
问题背景. 典型的情景:Nemo社区中,用户上传的图片免不了要在某处给用户做展示. 如用户上传的头像,那么其他用户在浏览该用户信息的时候,就会需要回显头像信息了. 用户上传的原图可能由于清晰度较高而体 ...
- python matplotlib在一张画布上画多个图的两种方法,plt.subplot(),plt.subplots()。
Matplotlib在一张画布上画多个图的两种方法,plt.subplot,plt.subplots. 目录 回顾 plt.subplots()画法 plt.subplot()画法 保存 回顾 之前也 ...
- android获取位图字节数,Android中获取图片尺寸大小两种方法
两种方法 建议用第二种 private void getPictureSize(String path) { /*第一种直接把bitmap加载到内存中,通过对bitmap的测量, 得出宽高,由于这个 ...
- android 获取当前时间精确到毫秒的两种方法
1.概述 在android app开发中,在项目中有些功能需求要求要获取当前时间精确到毫秒,已便于完成功能开发的需要,而在android 的系统api中提供了SimpleDateFormat和Cale ...
最新文章
- Android之关于图表
- 使用pg_stat_statement监控pgsql遇到的问题
- p和li之间的应用上的区别
- 在windows下使用vim
- LiveVideoStackCon 2020 漫游指南
- python数据分析实战案例-Python数据分析案例实战
- 第10章 Python 数字图像处理(DIP) - 图像分割 基础知识 标准差分割法
- C语言 *p++/*(p)++/*(p++)/*p++ - C语言零基础入门教程
- 《SpringCloud超级入门》使用Eureka集群搭建《十三》
- Python开发-- Lesson 2--Python数据类型(2016/07/30)
- OJ1019: 公园门票
- 玩转Java注解:元注解、内置注解、自定义注解的原理和实现
- 函数指针的定义和函数指针数组
- C语言实现TCP服务端
- Hou的图像显著性计算模型
- 英国正在大举进军AI,看懂其三大投资走向
- office2013多次输入激活码的问题
- calfcamel 的 2333
- 隆重推荐几本幼儿教育的书籍
- 地图的电子围栏功能的技术选型