transitiondrawable ImageVIew切换动画

一个TransitionDrawable是一个特殊的Drawable对象,可以实现两个drawable资源之间淡入淡出的效果。

<transition>节点下的每个<item>代表一个drawable资源。只能有两个<item>。先前转换调用startTransition()。向后,调用 reverseTransition()

文件位于:
res/drawable/filename.xml
文件名作为资源ID
编译资源类型:
指向 TransitionDrawable的指针
资源引用:
In Java: R.drawable.filename
In XML: @[package:]drawable/filename
语法:
<?xml version="1.0" encoding="utf-8"?>
<transition
xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
</transition>
元素:
<transition>
必须的。  必须作为根节点,包含一个或多个<item>元素。

属性:

xmlns:android
字符串类型,必须的。定义XML文件的命名空间,必须是 "http://schemas.android.com/apk/res/android".
<item>
定义一个TransitionDrawable中所使用的一个drawable。必须是<transition>子节点。可以接受<bitmap>子节点。

属性:

android:drawable
Drawable 资源。 必须的。引用一个Drawable资源。
android:id
资源ID。drawable资源的唯一标识。使用"@+id/name"方式来给这个item定义一个新的资源ID。可以使用View.findViewById()或者 Activity.findViewById()等方式检索和修改这个item。
android:top
Integer。 与顶部的距离
android:right
Integer。与右边的距离
android:bottom
Integer。 与下边的距离
android:left
Integer。与左边的距离
例子:
XML文件保存为:res/drawable/transition.xml

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/on" />
    <item android:drawable="@drawable/off" />
</transition>

在layout文件中使用:

<ImageButton
    android:id="@+id/button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/transition" />

And the following code performs a 500ms transition from the first item to the second:

ImageButton button = (ImageButton) findViewById(R.id.button);
TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();
drawable.startTransition(500);
参考

下面是实例:

1、xml方式使用

transition.xml:

[java] view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <transition xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <item android:drawable="@drawable/image01"/>
  4. <item android:drawable="@drawable/image02"/>
  5. </transition>

在layout中使用:

[java] view plain copy

  1. <ImageView
  2. android:id="@+id/imgView"
  3. android:src="@drawable/transition"
  4. android:layout_width="wrap_content"
  5. android:layout_height="wrap_content"/>

在代码中控制:

[java] view plain copy

  1. ImageView imageView = (ImageView) findViewById(R.id.imgView);
  2. TransitionDrawable transitionDrawable = (TransitionDrawable) imageView.getDrawable();
  3. transitionDrawable.startTransition(3000);

下面是一个实例:实现多张图片循环的淡入淡出的效果。

[java] view plain copy

    1. package com.example.drawabletest;
    2. import android.app.Activity;
    3. import android.graphics.Bitmap;
    4. import android.graphics.BitmapFactory;
    5. import android.graphics.drawable.BitmapDrawable;
    6. import android.graphics.drawable.Drawable;
    7. import android.graphics.drawable.TransitionDrawable;
    8. import android.os.Bundle;
    9. import android.os.Handler;
    10. import android.os.Message;
    11. import android.widget.ImageView;
    12. public class MainActivity extends Activity {
    13. private int change=0;
    14. private int[] ids = new int[] { R.drawable.image1, R.drawable.image2, R.drawable.image3,
    15. R.drawable.image4, R.drawable.image5 };
    16. private Drawable[] drawables;
    17. private ImageView imageView;
    18. @Override
    19. public void onCreate(Bundle savedInstanceState) {
    20. super.onCreate(savedInstanceState);
    21. setContentView(R.layout.activity_main);
    22. imageView = (ImageView) findViewById(R.id.imgView);
    23. /*获得合适的drawable资源*/
    24. BitmapFactory.Options opts = new BitmapFactory.Options();
    25. opts.inJustDecodeBounds = true;
    26. BitmapFactory.decodeResource(getResources(), R.drawable.image1, opts);
    27. opts.inSampleSize = computeSampleSize(opts, -1, 500 * 500);
    28. opts.inJustDecodeBounds = false;
    29. drawables=new Drawable[ids.length];
    30. try {
    31. for (int i = 0; i < ids.length; i++) {// for循环,加载5个drawable资源
    32. Bitmap bmp = BitmapFactory.decodeResource(getResources(), ids[i], opts);
    33. drawables[i] = new BitmapDrawable(bmp);
    34. }
    35. } catch (Exception e) {
    36. e.printStackTrace();
    37. }
    38. //开启线程,改变transition
    39. new Thread(new MyRunnable()).start();
    40. }
    41. //处理transition的改变
    42. private Handler handler=new Handler(new Handler.Callback() {
    43. public boolean handleMessage(Message msg) {
    44. int duration=msg.arg1;
    45. TransitionDrawable transitionDrawable=null;
    46. transitionDrawable= new TransitionDrawable(new Drawable[] {
    47. drawables[change%ids.length],//实现从0 1 2 3 4 5 0 1 2.。。这样的不停转变
    48. drawables[(change+1)%ids.length] });
    49. change++;
    50. imageView.setImageDrawable(transitionDrawable);
    51. transitionDrawable.startTransition(duration);
    52. return false;
    53. }
    54. });
    55. //线程,去发送消息,让transition一直改变
    56. private class MyRunnable implements Runnable{
    57. public void run() {
    58. while (true) {
    59. int duration=3000;//改变的间隔
    60. Message message=handler.obtainMessage();
    61. message.arg1=duration;
    62. handler.sendMessage(message);
    63. try {
    64. Thread.sleep(duration);
    65. } catch (InterruptedException e) {
    66. e.printStackTrace();
    67. }
    68. }
    69. }
    70. }
    71. //计算合适的图片大小
    72. public static int computeSampleSize(BitmapFactory.Options options, int minSideLength,
    73. int maxNumOfPixels) {
    74. int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);
    75. int roundedSize;
    76. if (initialSize <= 8) {
    77. roundedSize = 1;
    78. while (roundedSize < initialSize) {
    79. roundedSize <<= 1;
    80. }
    81. } else {
    82. roundedSize = (initialSize + 7) / 8 * 8;
    83. }
    84. return roundedSize;
    85. }
    86. //计算合适的图片大小
    87. private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength,
    88. int maxNumOfPixels) {
    89. double w = options.outWidth;
    90. double h = options.outHeight;
    91. int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h
    92. / maxNumOfPixels));
    93. int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(
    94. Math.floor(w / minSideLength), Math.floor(h / minSideLength));
    95. if (upperBound < lowerBound) {
    96. // return the larger one when there is no overlapping zone.
    97. return lowerBound;
    98. }
    99. if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
    100. return 1;
    101. } else if (minSideLength == -1) {
    102. return lowerBound;
    103. } else {
    104. return upperBound;
    105. }
    106. }
    107. }
时间: 2024-11-08 22:19:44

transitiondrawable ImageVIew切换动画的相关文章

viewPager的切换动画

今天在看苏州通的代码,里面有个引导的代码,涉及到viewPager的切换动画: DepthPageTransformer : 1 package com.soyoungboy.guide; 2 import android.annotation.TargetApi; 3 import android.os.Build; 4 import android.support.v4.view.ViewPager; 5 import android.view.View; 6 /** 7 * 8 * @Cl

Android中Activity切换时共享视图元素的切换动画(4.x兼容方案)

同时发布在我的博客 点此进入 开始 上一篇讲了使用 Google 的 AppCompat-v7 来实现 Activity 切换时实现共享视图元素的切换动画.这一篇介绍两个可以兼容 4.x 的两个第三方方案. 上一篇:Android中Activity切换时共享视图元素的切换动画(5.0以上) 方案一:PreLollipopTransition 首先在 build.gradle 配置文件添加这个库依赖 dependencies { compile 'com.kogitune:pre-lollipop

Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0以下)

1.介绍如何使用setPageTransformer设置切换动画: 2.自定义PageTransformer实现个性的切换动画: 3.该方法在SDK11以下的版本不起作用,我们会对其做一定修改,让其向下兼容. 官方示例地址:http://developer.android.com/training/animation/screen-slide.html 有兴趣的可以去看看~~ 好了,下面开始编写代码~~ 2.setPageTransformer的使用 首先我们迅速的实现一个传统的ViewPage

Android切换动画之ViewPager

有过开发经验的程序员都知道这个效果,就是当我们第一次安装一个软件时有一个使用说明的图片切换效果,他是如何实现的呢?今天我们就一起学习一下吧,难度系数1.0,就是只要你仔细分析,都可以学会.废话不多说,下面我们开始本篇的介绍. 本篇我需要使用到ViewPager,对于ViewPager的介绍,就不再详述,网上关于ViewPager的介绍很多,大家可以自行去了解. 再进行动画效果制作之前我们先实现一个图片的切换效果. 布局文件: <RelativeLayout xmlns:android="h

Android的Activity切换动画特效库SwitchLayout,视图切换动画库,媲美IOS

由于看了IOS上面很多开发者开发的APP的视图界面切换动画体验非常好,这些都是IOS自带的,但是Android的Activity等视图切换动画并没有提供原生的,所以特此写了一个可以媲美IOS视图切换动画的Android视图切换动画特效库!SwitchLayout!可以说是目前Android上第一个,也是唯一的一个强大的视图切换动画库引擎! 作者:谭东 QQ:852041173 项目开源!推荐使用jar包形式! 没有经过作者允许,不可修改项目库源码自行发布. 如果你的项目中使用了SwtichLay

Android为ViewPager增加切换动画——自定义ViewPager

转载请注明出处:http://blog.csdn.net/allen315410/article/details/44224517 在上篇博客中,我写了一个使用属性动画为ViewPager添加切换动画的方法,并且可以兼容到Android3.0以下版本的设备上,那么关于为ViewPager添加动画的方式还会有另外一种实现方案,就是自定义一个自己带动画效果的ViewPager,关于上篇博客,还没来得及查看的朋友可以点击这里进行查看.下面,我们将新建一个工程,来说说怎样自定义一个自带切换动画效果的Vi

iOS 自定义页面的切换动画与交互动画 By Swift(转)

交互动画切换动画Swiftiosios7 目录(?)[-] 最终效果预览 自定义导航栏的PushPop动画 自定义Modal的PresentDismiss动画 自定义导航栏的交互式动画 使用UIPercentDrivenInteractiveTransition 自定义交互控制器 最终效果 UPDATED 在iOS7之前,开发者为了寻求自定义Navigation Controller的Push/Pop动画,只能受限于子类化一个UINavigationController,或是用自定义的动画去覆盖

Android为ViewPager增加切换动画——使用属性动画

转载请注明出处:http://blog.csdn.net/allen315410/article/details/44200623 ViewPager作为Android最常用的的组件之一,相信大家在项目中会频繁的使用到的,例如利用ViewPager制作引导页.轮播图,甚至做整个app的表现层的框架等等. Android3.0以下不支持切换动画 但是在Android 3.0(API 11)以下的ViewPager是比较死板的,不支持动画特效的,这也就让ViewPager在切换的时候达不到很好的用户

安卓开发_慕课网_ViewPager切换动画(3.0版本以上有效果)

学习内容来自“慕课网” 一般APP进去之后都会有几张图片来导航,这里就学习怎么在这张图片切换的时候添加切换动画效果 先看布局文件 activity_main.layout <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_widt