`
119568242
  • 浏览: 426944 次
  • 性别: Icon_minigender_1
  • 来自: 深圳/湛江
社区版块
存档分类
最新评论

[android]仿制新浪微博消息页面 图标切换动画

 
阅读更多

研究了下以前不怎么用到的动画效果的实现 

顺便做了一个新浪微博消息页面 图标切换动画 效果的实例

 

如图


然后封装了一下这个效果的实现代码

 

如下

 

package com.lurencun.unit.unit;

import android.app.Activity;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;

/**
 * 标签切换对应动画效果实现类
 * 
 * @author poolo
 * @since 2012年8月10日
 * @version 1.0.0 完成了2,3,4个标签的情况下的处理(越多- -就要以笛卡尔积的数量增长- -我觉得呢2~4够用了)
 */
public class Unit {
    private int current = 0;
    private Activity at;
    private ImageView cursor;
    private float bmpW;
    private float screenW;
    private float offset;// 偏移量

    /**
     * 
     * @param a
     *            当前Activity
     * @param layoutId
     *            当前作为图标使用的ImageViewId
     * @param drawId
     *            当前图标的drawId
     * @param num
     *            当前标签个数
     */
    public Unit(Activity a, int viewId, int drawId, int num) {
        at = a;
        init(viewId, drawId, num);
    }

    /**
     * 纯粹是为了好看些的一个初始化数据包 无视这里吧
     * 
     * @param viewId
     * @param drawId
     * @param num
     */
    private void init(int viewId, int drawId, int num) {
        cursor = (ImageView) at.findViewById(viewId);
        bmpW = BitmapFactory.decodeResource(at.getResources(), drawId)
                .getWidth();
        screenW = at.getWindowManager().getDefaultDisplay().getWidth();
        offset = (screenW / num - bmpW) / 2;
        Matrix matrix = new Matrix();
        matrix.postTranslate(offset, 0);
        cursor.setImageMatrix(matrix);
    }

    /**
     * 两个标签的情况
     * @param selectId 被选中的id
     */
    public void move2tag(int selectId) {
        Animation animation = null;
        float zero = 0;
        float one = offset * 2 + bmpW;
        switch (selectId) {
        case 0:
            if (current == 1) {
                animation = new TranslateAnimation(one, zero, 0, 0);
            }
            break;
        case 1:
            if (current == 0) {
                animation = new TranslateAnimation(zero, one, 0, 0);
            }
            break;
        }
        current = selectId;
        animation.setFillAfter(true);
        animation.setDuration(300);
        cursor.startAnimation(animation);
    }

    /**
     * 三个标签的情况
     * @param selectId 被选中的id
     */
    public void move3tag(int selectId) {
        Animation animation = null;
        float zero = 0;
        float one = offset * 2 + bmpW;
        float two = one * 2;
        switch (selectId) {
        case 0:
            if (current == 1) {
                animation = new TranslateAnimation(one, zero, 0, 0);
            }
            if (current == 2) {
                animation = new TranslateAnimation(two, zero, 0, 0);
            }
            break;
        case 1:
            if (current == 0) {
                animation = new TranslateAnimation(zero, one, 0, 0);
            }
            if (current == 2) {
                animation = new TranslateAnimation(two, one, 0, 0);
            }
            break;

        case 2:
            if (current == 0) {
                animation = new TranslateAnimation(zero, two, 0, 0);
            }
            if (current == 1) {
                animation = new TranslateAnimation(one, two, 0, 0);
                break;
            }
        }
        current = selectId;
        animation.setFillAfter(true);
        animation.setDuration(300);
        cursor.startAnimation(animation);
    }

    /**
     * 四个标签的情况
     * @param selectId 被选中的id
     */
    public void move4tag(int selectId) {
        Animation animation = null;
        float zero = 0;
        float one = offset * 2 + bmpW;
        float two = one * 2;
        float three = one * 3;
        switch (selectId) {
        case 0:
            if (current == 1) {
                animation = new TranslateAnimation(one, zero, 0, 0);
            }
            if (current == 2) {
                animation = new TranslateAnimation(two, zero, 0, 0);
            }
            if (current == 3) {
                animation = new TranslateAnimation(three, zero, 0, 0);
            }
            break;
        case 1:
            if (current == 0) {
                animation = new TranslateAnimation(zero, one, 0, 0);
            }
            if (current == 2) {
                animation = new TranslateAnimation(two, one, 0, 0);
            }
            if (current == 3) {
                animation = new TranslateAnimation(three, one, 0, 0);
            }
            break;

        case 2:
            if (current == 0) {
                animation = new TranslateAnimation(zero, two, 0, 0);
            }
            if (current == 1) {
                animation = new TranslateAnimation(one, two, 0, 0);

            }
            if (current == 3) {
                animation = new TranslateAnimation(three, two, 0, 0);
            }
            break;
        case 3:
            if (current == 0) {
                animation = new TranslateAnimation(zero, three, 0, 0);
            }
            if (current == 1) {
                animation = new TranslateAnimation(one, three, 0, 0);

            }
            if (current == 2) {
                animation = new TranslateAnimation(two, three, 0, 0);
            }
            break;
        }
        current = selectId;
        animation.setFillAfter(true);
        animation.setDuration(300);
        cursor.startAnimation(animation);
    }
}
 

 

 一个需要注意的地方 使用此方法的童鞋 切记自己的ImageView需要设置 android:scaleType="matrix" 才能使图形作为矩形计算 不至于出现错误

 

    <ImageView
        android:id="@+id/testImg1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:contentDescription="@string/hello"
        android:scaleType="matrix"
        android:src="@drawable/jian_tou" />

 

 

部分借鉴与:http://www.eoeandroid.com/code/2012/0322/994_2.html

 

另如果路过的同学知道如何截android手机上的动态图麻烦留言告知下,谢谢。

 

jar包,源码,apk,截图都在下面。

 

 

已经交给团队封装代码的童鞋 将会封装到这个工具jar中

https://github.com/chenyoca/ToolkitForAndroid

 

2
3
分享到:
评论

相关推荐

    仿制新浪微博

    【标题】"仿制新浪微博"涉及的是iOS应用开发领域,主要目标是创建一个与新浪微博相似的应用程序。在iOS开发中,通常使用Objective-C或Swift语言,结合Apple的开发框架UIKit来构建用户界面,并通过WebKit处理网页内容...

    ios-新浪微博弹出动画(仿).zip

    在仿制新浪微博的弹出动画中,我们需要关注以下几个关键点: 1. **自定义转场动画**:利用`UIViewControllerAnimatedTransitioning`协议,可以实现视图控制器间的自定义过渡动画。在这个例子中,可能是通过一个平滑...

    仿新浪微博客户端

    【标题】"仿新浪微博客户端"涉及的是一款针对Android平台开发的应用程序,旨在模仿新浪微博的功能和用户体验。这样的项目对于初学者来说是一个很好的实践案例,因为它涵盖了移动应用开发中的多个关键技术和设计原则...

    android listview 下拉刷新 上拉翻页 仿新浪微博客户端

    在仿制新浪微博客户端的过程中,还需要考虑以下几点: 1. 数据分页:为了优化性能,通常不一次性加载所有数据,而是采用分页的方式,每次只加载一部分数据。 2. 动画效果:下拉刷新时,可以添加旋转的刷新指示器动画...

    android 仿微信5.2 新浪微博

    在Android开发领域,微信5.2界面和新浪微博客户端的仿制是常见的学习项目,它们能够帮助开发者提升对Android设计规范、UI布局以及网络通信的理解。本文将深入探讨这两个项目的实现,涉及的知识点主要包括: 1. **...

    仿新浪微博发布评论js代码

    【标题】"仿新浪微博发布评论js代码"是一个用于创建类似新浪微博风格评论功能的JavaScript实现,主要针对网页中的交互设计。这种代码适用于希望在网站上添加一个简洁且具有类似社交网络功能的评论系统的开发者。 ...

    ios-仿新浪微博弹出动画.zip

    这个“ios-仿新浪微博弹出动画.zip”文件包含了一个模仿新浪微博应用中弹出动画的示例,主要用于帮助开发者理解和实现类似的交互效果。 在iOS中,视图动画主要通过Core Animation框架来实现,它提供了丰富的API来...

    Android高级应用源码-仿照新浪微博Android客户端个人中心的ScrollView.zip

    该压缩包文件“Android高级应用源码-仿照新浪微博Android客户端个人中心的ScrollView.zip”包含了一个针对Android平台的高级开发示例,旨在模仿新浪微博应用程序个人中心的ScrollView组件。ScrollView是Android UI...

    基于Python+Flask的仿制版微博源码+部署文档+全部数据资料 高分项目.zip

    基于Python+Flask的仿制版微博源码+部署文档+全部数据资料 高分项目.zip基于Python+Flask的仿制版微博源码+部署文档+全部数据资料 高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩...

    MyWeibo:仿制的新浪微博

    仿制的新浪微博 功能 使用ASI访问微博接口 简单的换肤功能 发送文字微博功能 下拉刷新最新微博 提示未读微博数量 发送带地理位置的微博 选择地理位置时查询附近的地点 扫描二维码(此功能需要在真机查看) 开发...

    四次元新浪微博(1).zip

    《四次元新浪微博(1).zip》是一个包含Android源码的学习资源包,主要适用于那些希望深入理解Android开发,特别是对JAVA ANDROID编程有兴趣的开发者。这个压缩包中的内容可能包括了微博应用的客户端源代码,提供了...

    Android仿微信6.0,可自定义切换动画

    "Android仿微信6.0,可自定义切换动画"这个项目就是针对微信6.0版本的UI设计进行的一次实现,它允许开发者创建类似微信的应用,并且能够自定义页面切换时的动画效果。 微信6.0的界面设计简洁而直观,注重用户体验,...

    Android-coordinatorlayouttablayout仿微博个人页

    在仿制微博个人页面中,`CoordinatorLayout`通常用作根布局,它可以与`AppBarLayout`结合使用,实现类似顶部导航栏在滚动时渐隐渐现的效果,提供更好的用户体验。 `TabLayout`则是谷歌提供的一个用于展示标签页的...

    基于Flask的仿制版微博全部资料+详细文档.zip

    基于Flask的仿制版微博全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用...

    仿微博HTML源码

    在仿制微博页面时,可能会用到如、、、等新标签来增强页面的可读性和可维护性。 【压缩包子文件的文件名称列表】中,我们可以推测出项目结构: - `index.html`、`2.html`、`1.html`、`3.html`:这四个HTML文件代表...

    仿新浪微博

    【标题】:“仿新浪微博” 该项目的核心目标是创建一个与新浪微博类似的平台,允许用户进行阅读、发布及互动操作。实现这一目标的关键在于理解并利用新浪微博提供的API(Application Programming Interface)文档,...

    Android仿新浪微博、QQ空间等帖子显示(1)

    在Android开发中,为了实现类似新浪微博和QQ空间的帖子显示功能,我们需要对文本进行复杂的样式设置和交互处理。这些功能通常涉及到对TextView的扩展和利用SpannableString对象来标记和控制文本的不同部分。以下是几...

    Python优秀项目 基于Flask+MySQL实现的仿制版微博源码+部署文档+全部数据资料.zip

    Python优秀项目 基于Flask+MySQL实现的仿制版微博源码+部署文档+全部数据资料.zip 1、代码压缩包内容 代码的项目文件 部署文档文件 2、代码运行版本 python3.7或者3.7以上的版本;若运行有误,根据提示GPT修改;若...

    android 仿制网易新闻

    在Android开发中,"仿制网易新闻"是一个常见的学习项目,主要是通过运用ListView组件来实现类似新闻应用的列表展示功能。这个项目可以帮助开发者熟练掌握Android UI设计和数据绑定技术。以下将详细介绍涉及的知识点...

Global site tag (gtag.js) - Google Analytics