您的位置:首页 > 移动开发 > Android开发

Android开发艺术探索<Drawable系列之五ScaleDrawable >

2016-12-11 19:45 465 查看
    ScaleDrawable对应于xml文件中的<scale>标签,可以根据自己的level将指定的drawable缩放到一定比例。基本语法如下:

<?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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: