Android - 实现各种形状的ImageView
来源:互联网 发布:淘宝最低价网查询 编辑:程序博客网 时间:2024/06/10 02:36
实现各种形状的ImageView要用到BitmapShader类,这个类的介绍如下:
BitmapShader是Shader的子类,可以通过Paint.setShader(Shader shader)进行设置、
这里我们只关注BitmapShader,构造方法:
mBitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
参数1:bitmap
参数2,参数3:TileMode;
TileMode的取值有三种:
CLAMP 拉伸
REPEAT 重复
MIRROR 镜像
如果大家给电脑屏幕设置屏保的时候,如果图片太小,可以选择重复、拉伸、镜像;
重复:就是横向、纵向不断重复这个bitmap
镜像:横向不断翻转重复,纵向不断翻转重复;
拉伸:这个和电脑屏保的模式应该有些不同,这个拉伸的是图片最后的那一个像素;横向的最后一个横行像素,不断的重复,纵项的那一列像素,不断的重复;
现在大概明白了,BitmapShader通过设置给mPaint,然后用这个mPaint绘图时,就会根据你设置的TileMode,对绘制区域进行着色。
这里需要注意一点:就是BitmapShader是从你的画布的左上角开始绘制的,不在view的右下角绘制个正方形,它不会在你正方形的左上角开始。
好了,到此,我相信大家对BitmapShader有了一定的了解了;
对于我们的圆角,以及圆形,我们设置的模式都是CLAMP ,但是你会不会会有一个疑问:
view的宽或者高大于我们的bitmap宽或者高岂不是会拉伸?
嗯,我们会为BitmapShader设置一个matrix,去适当的放大或者缩小图片,不会让“ view的宽或者高大于我们的bitmap宽或者高 ”此条件成立的。
到此我们的原理基本介绍完毕了,拿到drawable转化为bitmap,然后直接初始化BitmapShader,画笔设置Shader,最后在onDraw里面进行画圆就行了。
下面通过一个简单的实例来看一下如何使用BitmapShader和ShapeDrawable实现椭圆形的图片。
自定义一个View继承自View,如下:
public class BitmapShaders extends View {
private BitmapShader bitmapShader = null;
private Bitmap bitmap = null;
private ShapeDrawable shapeDrawable = null;
private int BitmapWidth = 0;
private int BitmapHeight = 0;
public BitmapShaders(Context context) {
super(context);
//得到图像
bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.h)).getBitmap();
BitmapWidth = bitmap.getWidth();
BitmapHeight = bitmap.getHeight();
//构造渲染器BitmapShader
bitmapShader = new BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.REPEAT);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//将图片裁剪为椭圆形
//构建ShapeDrawable对象并定义形状为椭圆
shapeDrawable = new ShapeDrawable(new OvalShape());
//得到画笔并设置渲染器
Paint paint = shapeDrawable.getPaint();
paint.setShader(bitmapShader);
//设置显示区域
shapeDrawable.setBounds(120, 120, BitmapWidth + 120, BitmapHeight + 120);
//绘制shapeDrawable
shapeDrawable.draw(canvas);
}
}
在构造方法中通过getResource().getDrawable获取Drawable对象,然后再通过getBitmap方法获取BitmapDrawable对象,然后通过getWidth和getHeight方法获取图片的宽高。
此外同时初始化了BitmapShader对象,需要三个参数,第一个是BitmapDrawable对象,后面两个参数确定了镜像和重复的模式。
最重要的是onDrawable方法,可以参考注释部分。
Activity类中实现自定义View,如下:
public class BitmapShaderActivity extends Activity {
private BitmapShaders bitmapShaders = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bitmapShaders = new BitmapShaders(this);
setContentView(bitmapShaders);
}
}
运行实例如下:
这时看到并没有镜像和重复的效果,原因是设置的显示区域过小,可以重新设置这一行代码如下:
shapeDrawable.setBounds(120, 120, BitmapWidth + 320, BitmapHeight + 320);
再次运行实例如下:
初始化ShapeDrawable时需要传入一个Shape对象,上面的实例初始化传入了new OvalShape()对象,也就是椭圆形,除此之外,还有如下Shape对象:
分别是:扇形、椭圆形、位图、矩形、圆角矩形。
修改一行代码如下:
shapeDrawable = new ShapeDrawable(new RectShape());
运行实例如下:
修改代码如下:
shapeDrawable = new ShapeDrawable(new OvalShape());
//得到画笔并设置渲染器
Paint paint = shapeDrawable.getPaint();
paint.setShader(bitmapShader);
//设置显示区域
shapeDrawable.setBounds(120, 120, 520, 520);
可以实现圆:
当然,也可以通过xml布局文件引入:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.administrator.bitmapdemo.BitmapShaders
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
运行实例如下:
其他的模式可以自行测试,这里就不再演示了。
谢谢关注我的微信公众号,觉得好可以分享到朋友圈哦.
请关注我的新浪微博:AndroidTip
CSDN博客:http://blog.csdn.net/yayun0516
- Android - 实现各种形状的ImageView
- Android - 实现各种形状的ImageView
- 定制各种形状的ImageView
- Android自定义控件-不同形状的ImageView
- 一个比较强大的提供各种形状的ImageView
- Android 自定义形状ImageView
- 自定义形状的ImageView
- CSS实现各种形状
- Android中各种形状
- ImageView设计成圆角的形状
- CustomShapeImageView 自定义形状的ImageView
- ImageView设计成圆角的形状
- 自定义形状的ImageView制作
- 各种形状的鼠标
- 各种形状的鼠标
- Android设置ImageView对话框背景形状
- Android四角形状(角度)不规则ImageView方案
- 使用Xfermode实现图片各种形状的抠图
- 监听器(Listener)在开发中的应用(二)
- Linux进程间通信之共享内存
- 2016
- Spring中@PropertySouce注解的使用
- hdu 1251 字典树入门
- Android - 实现各种形状的ImageView
- 高级软件工程师之路-操作系统
- 人工智能、机器学习和深度学习三者的关系与应用
- 174.Remove Nth Node From End of List-删除链表中倒数第n个节点(容易题)
- 项目3 - 体验复杂度(2)
- 面向对象
- VMware下minimal CentOS7 安装VMware tools
- JS不同浏览器创建xmlhttprequest对象的方法
- TCP-IP详解:超时重传机制