Drawable解析4——StateListDrawable和AnimationDrawable
  Op9yysgqYUmV 2023年11月12日 24 0


1、估计StateListDrawable是大家用的最多一个drawable了,所有的控件背景基本上都使用了StateListDrawable,以实现其在不同状态下显示不同的效果,例如按钮的按下、选中、默认、禁用等多种模式状态。StateListDrawable用于管理一组drawable,每个drawable都对应一组状态,状态的选择类似于java中的switch-case组合,按照顺序比较状态,当遇到匹配的的状态,就返回对应的drawable,因此需要把最精确的匹配放置到最前面,整体按照从精确到粗略的顺序排列。在xml文件中使用selector作为根节点来定义StateListDrawable,并使用item作为子节点定义不同状态下的drawable。selector和item的属性如下:

Drawable解析4——StateListDrawable和AnimationDrawable_android

Drawable解析4——StateListDrawable和AnimationDrawable_api_02



  • 定义一个state_list_drawable.xml


<?xml version="1.0" encoding="utf-8"?>
  
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  

  
    <item android:drawable="@drawable/button_normal" android:state_focused="false" android:state_pressed="false"/>
  
    <item android:drawable="@drawable/button_pressed" android:state_pressed="true"/>
  
    <item android:drawable="@drawable/button_focused" android:state_focused="true"/>
  

  
</selector>


  • 当然我也可以不使用drawable,直接使用颜色也可以,编写state_list_color.xml


<?xml version="1.0" encoding="utf-8"?>
  
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  

  
<item android:state_focused="false" android:color="#ffffff"/>
   
    <item android:state_focused="true" android:color="#ff0000"/>
  

  
</selector>


  • 在activity_main.xml中为一个Button和EditText分别设置背景


<Button
  
        android:id="@+id/button2"
  
        android:layout_width="wrap_content"
  
        android:layout_height="wrap_content"
  
        android:background="@drawable/state_list_drawable"
  
        android:text="按键效果" />
  

  
    <EditText
  
        android:layout_width="match_parent"
  
        android:layout_height="wrap_content"
  
        android:textColor="@drawable/state_list_color" >
  
    </EditText>


写个例子:

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false"><itemandroid:drawable="@drawable/anim1"android:duration="300"/><itemandroid:drawable="@drawable/anim2"android:duration="300"/><itemandroid:drawable="@drawable/anim3"android:duration="300"/></animation-list>


定义了AnimationDrawable之后,需要主动调用AnimationDrawable的start方法播放动画,注意在onCreate方法中调用start方法是没有任何效果的,这是因为此时View还没有完成初始化,可以使用handler来实现延迟播放动画,代码如下:


mHandler.postDelayed(new Runnable() {
  

  
                        public void run() {
  
                            (mAnimationDrawable.start();
  
                        }
  

  
                    }, 300);


再说下补间动画的使用, 补间动画使用set作为根节点进行定义,结构如下:


<?xml version="1.0" encoding="utf-8"?>
 
<set xmlns:android="http://schemas.android.com/apk/res/android"
 
android:interpolator="@[package:]anim/interpolator_resource"
 
android:shareInterpolator=["true"|"false"]
 
android:duration="持续时间">
 
<alpha/>设置透明度的改变
 
<scale/>设置图片进行缩放改变
 
<translate/>设置图片进行位移变换
 
<rotate/>设置图片进行旋转




举个例子,在res\anim\my_anim.xml定义


<?xml version="1.0" encoding="UTF-8"?>
  
<set xmlns:android="http://schemas.android.com/apk/res/android"
  
    android:interpolator="@android:anim/linear_interpolator"
  
    android:duration="5000">
  
    <!-- 定义缩放变换 -->
  
    <scale android:fromXScale="1.0"  
  
        android:toXScale="1.4"  
  
        android:fromYScale="1.0"  
  
        android:toYScale="0.6"  
  
        android:pivotX="50%" 
  
        android:pivotY="50%" 
  
        android:fillAfter="true" 
  
        android:duration="2000"
  
    /> 
  
    <!-- 定义位移变换 -->        
  
    <translate android:fromXDelta="10"
  
        android:toXDelta="130"
  
        android:fromYDelta="30"
  
        android:toYDelta="-80"
  
        android:duration="2000"
  
    />
  
</set>


在java代码中如下调用


mImageView2 = (ImageView) findViewById(R.id.imageView2);
  
        mAnimationDrawable2=AnimationUtils.loadAnimation(this, R.anim.my_anim);
  
        // 设置动画结束后保留结束状态
  
        mAnimationDrawable2.setFillAfter(true);
  
        mButton1.setOnClickListener(new OnClickListener() {
  

  
            @Override
  
            public void onClick(View v) {
  
                // TODO Auto-generated method stub
  
                mImageView2.startAnimation(mAnimationDrawable2);
  
            }
  
        });




看下最终效果吧:


Drawable解析4——StateListDrawable和AnimationDrawable_api_03


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  cBnrSAyWmGQb   2023年11月30日   40   0   0 androidjarJavajavaandroidjar
Op9yysgqYUmV