ScaleDrawable的简单使用

来源:互联网 发布:上海孚盟软件 编辑:程序博客网 时间:2024/04/19 11:24

本篇博客是介绍Drawable相关子类的第八篇博客,ScaleDrawable的使用跟RotateDrawable的使用很类似,都是使用level值对drawable进行相关的操作。当然既然名字都是叫ScaleDrawable,那肯定就是缩放操作了。不过效果图更像ClipDrawable,有兴趣的话可以自己比较一下。下看一下效果图吧!

这里写图片描述

主布局文件:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.scaledrawable.MainActivity">    <ImageView        android:clickable="true"        android:focusable="true"        android:id="@+id/iv"        android:scaleType="fitXY"        android:layout_width="400dp"        android:layout_height="400dp"        android:layout_centerHorizontal="true"        android:background="@color/colorAccent"        android:src="@drawable/scale_drawable" />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_below="@id/iv"        android:layout_marginTop="10dp"        android:onClick="setScaleDrawableLevel"        android:text="@string/set_scale" /></RelativeLayout>

scale_drawable文件:

<?xml version="1.0" encoding="utf-8"?><scale xmlns:android="http://schemas.android.com/apk/res/android"    android:scaleGravity="bottom"    android:scaleWidth="100%"    android:scaleHeight="100%">    <ripple android:color="@color/colorPrimary">        <item android:drawable="@drawable/first" />    </ripple></scale>

Java文件:

package com.example.scaledrawable;import android.graphics.drawable.RotateDrawable;import android.graphics.drawable.ScaleDrawable;import android.os.CountDownTimer;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.ImageView;public class MainActivity extends AppCompatActivity {    private ImageView iv;    private ScaleDrawable drawable;    private final int UPDATE_VIEW = 99;    private boolean IS_SCALING = false;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        iv = (ImageView) findViewById(R.id.iv);        drawable = (ScaleDrawable) iv.getDrawable();        drawable.setLevel(0);    }    public void setScaleDrawableLevel(View view) {        if (drawable instanceof ScaleDrawable) {//            drawable.setLevel(5000);            if (!IS_SCALING) {                IS_SCALING = true;                timer.start();            }        }    }    private CountDownTimer timer = new CountDownTimer(Integer.MAX_VALUE, 60) {        @Override        public void onTick(long millisUntilFinished) {            mHandler.sendEmptyMessage(UPDATE_VIEW);        }        @Override        public void onFinish() {            IS_SCALING = false;        }    };    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what) {                case UPDATE_VIEW:                    int level = drawable.getLevel();                    Log.i("zyq", "level = " + level);                    if (level >= 10000) {                        timer.cancel();                        drawable.setLevel(10000);                    } else {                        drawable.setLevel(level + 100);                    }                    break;            }        }    };}

在使用ScaleDrawable的时候,level值为的时候drawable的宽高都为零,也就是说看不见drawable, android:scaleWidth 、 android:scaleHeight都是必须要设置的值。不然的话可能出现没有效果的情况发生。具体原因还是看一下源码吧!!!!

    @Override    protected boolean onLevelChange(int level) {        super.onLevelChange(level);        onBoundsChange(getBounds());        invalidateSelf();        return true;    }    @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;            w -= (int) ((w - iw) * (MAX_LEVEL - level) * mState.mScaleWidth / MAX_LEVEL);        }        int h = bounds.height();        if (mState.mScaleHeight > 0) {            final int ih = min ? d.getIntrinsicHeight() : 0;            h -= (int) ((h - ih) * (MAX_LEVEL - level) * mState.mScaleHeight / MAX_LEVEL);        }        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);        }    }

这里的mState.mScaleHeight的值就是我们在xml中设置的值。相信你一定可以看懂为什么不设置的时候scaleDrawable不缩放。在ScaleDrawable中,android:scaleGravity这个属性的值得作用跟ClipDrawable中的android:gravity属性的作用类似,不清楚的可以查看我前面写的关于ClipDrawable的博客。
好了,关于ScaleDrawable的内容就说到这了!!

这是我的微信公众号,如果可以的话,希望您可以帮忙关注一下,这将是对我最大的鼓励了,谢谢!!
公众号

代码地址:
里面的代码比较杂,就劳烦您自己copy出来了!!

0 0