Android开发艺术探索<Drawable系列之五ScaleDrawable >
2016-12-11 19:45
465 查看
ScaleDrawable对应于xml文件中的<scale>标签,可以根据自己的level将指定的drawable缩放到一定比例。基本语法如下:
android:scaleGravity属性相当于gravity属性,缩放之后的效果。
android:scaleHeight/scaleWidth 表示Drawable的缩放比例,20%就是显示的时候还剩80%
需要注意的是: android:level不能为0,否则没有效果,来看下ScaleDrawable源码的draw方法:
分析获取属性值的方法,可以看出mDrawable的大小和等级以及缩放关系。
示例将一个Drawable缩放到30%:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@color/blue"
android:level="1"
android:scaleGravity="center"
android:scaleHeight="20%"
android:scaleWidth="20%" />
android:scaleGravity属性相当于gravity属性,缩放之后的效果。
android:scaleHeight/scaleWidth 表示Drawable的缩放比例,20%就是显示的时候还剩80%
需要注意的是: android:level不能为0,否则没有效果,来看下ScaleDrawable源码的draw方法:
@Override
public void draw(Canvas canvas) {
final Drawable d = getDrawable();
if (d != null && d.getLevel() != 0) {
d.draw(canvas);
}
}
分析获取属性值的方法,可以看出mDrawable的大小和等级以及缩放关系。
@Override
protected void onBoundsChange(Rect bounds) {
final Drawable d = getDrawable();
final Rect r = mTmpRect;
final boolean min = mState.mUseIntrinsicSizeAsMin;
final int level = getLevel();
int w = bounds.width();
if (mState.mScaleWidth > 0) {
final int iw = min ? d.getIntrinsicWidth() : 0;
//这里的iw一般都为0 ,可以得到:ScaleDrawable级别最大值10000,level越高,看起来越大,定义的缩放比例越大,看起来越小。
w -= (int) ((w - iw) * (10000 - level) * mState.mScaleWidth / 10000);//iw一般都为0
}
int h = bounds.height();
if (mState.mScaleHeight > 0) {
final int ih = min ? d.getIntrinsicHeight() : 0;
h -= (int) ((h - ih) * (10000 - level) * mState.mScaleHeight / 10000);
}
final int layoutDirection = getLayoutDirection();
Gravity.apply(mState.mGravity, w, h, bounds, r, layoutDirection);
if (w > 0 && h > 0) {
d.setBounds(r.left, r.top, r.right, r.bottom);
}
}
示例将一个Drawable缩放到30%:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@mipmap/ic_launcher"
android:scaleGravity="center"
android:scaleHeight="70%"
android:scaleWidth="70%" />
View scale = findViewById(R.id.scaleDrawable);
ScaleDrawable scaleDrawable = (ScaleDrawable) scale.getBackground();
scaleDrawable.setLevel(1);
相关文章推荐
- Android开发艺术探索<Drawable系列之一BitmapDrawable>
- Android开发艺术探索<Drawable系列之二ShapeDrawable>
- Android开发艺术探索<Drawable系列之四StateListDrawable >
- Android开发艺术探索<Drawable系列之六ClipDrawabe >
- Android开发艺术探索<Android的序列化>
- Android开发艺术探索<Android的线程池>
- <<Android 开发艺术探索>> 第一章 Actiivty的生命周期和启动模式
- <<Android开发艺术探索>>读书笔记--Activity LaunchMode
- <<Android开发艺术探索>>读书笔记--IntentFilter
- Android开发艺术探索<View的点击事件触发过程>
- Android开发艺术探索<Notification使用>
- Android 开发艺术探索笔记 第六章 Android的Drawable
- Android开发艺术探索第六章——Android的Drawable
- 第六章Andorid的Drawable(Android开发艺术探索)
- Android开发艺术探索_Android的Drawable(六)
- Android React-Native系列之<一>零基础搭建React-Native开发环境
- 【读书笔记】【Android 开发艺术探索】第 6 章 Android 的 Drawable
- Android 开发 Tip 15 -- can be replaced by one <TextView/> and a compound drawable
- 读 << Android开发之Theme、Style探索及源码浅析 >> 一文记录下
- 读书笔记:Android开发艺术探索之第6章 android的Drawable