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
- ScaleDrawable的简单使用
- ScaleDrawable
- Scaledrawable
- ScaleDrawable的正确打开方式
- Android ScaleDrawable
- android drawable ScaleDrawable
- Android-drawable资源-ScaleDrawable
- 6.8 Android Framework - ScaleDrawable
- Android Drawable之ScaleDrawable
- Android Drawable之ScaleDrawable
- Drawable学习之-----ScaleDrawable
- Drawable子类——ScaleDrawable
- 简单易懂的使用
- ant的简单使用
- Log4j的简单使用
- TCPDUMP的简单使用
- IComparer的简单使用
- TreeView的简单使用
- e舞成名 模拟器歌曲 每月同步更新, e舞成名脚谱下载
- 树莓派初接触
- 必须通过某种方法,来宣传出自己的震慑力。
- Robotframework构架搭建和配置说明
- HDU4185-Oil Skimming
- ScaleDrawable的简单使用
- Chrome开发者工具不完全指南(五、移动篇)
- linux网络编程之并发服务器的三种实现模型 (超级经典)
- installation failed with message faild to establish session
- Java利用动态代理模拟实现Spring的AOP(面向切面编程)功能的小实践
- Chrome开发者工具不完全指南(六、插件篇)
- Linux usb子系统(一) _写一个usb鼠标驱动
- 编程思想——程序设计
- 设计模式——工厂方法模式