android TranslateAnimation 顶部segment分段移动动画

这里实现的功能是从主页布局的fragment点击跳转到一个acitivity,然后顶部是一个切换的segment底部部是一个listview,点击segment分段让listview加载不同的内容。我这里没再使用viewpager,应该使用viewpager+listview也能实现。我这里使用的算是一个自定义的viewpager。下面我主要围绕TranslateAnimation segment切换动画类来谈,这东西吭比较多,我原本也是才做android开发的, 它这个类实现动画很多效果上的bug,效果bug直接说明android这个动画类没ios做的好,我遇到的这些效果bug主要出现在控件移动的距离和移动时间上的计算上。比如移动动画带有缓冲,或则移动分段两个以上,就没有动画效果。

下面先帖上布局,主要就是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
              android:background="@color/white_color"
              android:orientation="vertical" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="@dimen/navigationbar_height"
        android:textSize="@dimen/title_fontsize"
        android:text="在线视频"

        android:textColor="@color/navigation_title_color"
        android:background="@color/navigationbar_backround_color"
        android:gravity="center"/>
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="53dp"
         android:orientation="vertical"
         android:animateLayoutChanges="true"
         >
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="50dp"
             android:orientation="horizontal"
             >

         <TextView
             android:layout_width="match_parent"
             android:layout_height="@dimen/navigationbar_height"
             android:layout_weight="1"
             android:textSize="@dimen/title_fontsize"
             android:text="推荐"
             android:id="@+id/tuijianVideo"
             android:textColor="@color/hot_price_color"
             android:background="@color/navigationbar_backround_color"
             android:gravity="center"/>
         <TextView
             android:layout_width="match_parent"
             android:layout_height="@dimen/navigationbar_height"
             android:textSize="@dimen/title_fontsize"
             android:layout_weight="1"
             android:text="电影"
             android:id="@+id/dianying"
             android:textColor="@color/navigation_title_color"
             android:background="@color/navigationbar_backround_color"
             android:gravity="center"/>
         <TextView
             android:layout_width="match_parent"
             android:layout_height="@dimen/navigationbar_height"
             android:textSize="@dimen/title_fontsize"
             android:text="电视"
             android:id="@+id/dianshi"
             android:layout_weight="1"
             android:textColor="@color/navigation_title_color"
             android:background="@color/navigationbar_backround_color"
             android:gravity="center"/>
         <TextView
             android:layout_width="match_parent"
             android:layout_height="@dimen/navigationbar_height"
             android:textSize="@dimen/title_fontsize"
             android:text="动漫"
             android:layout_weight="1"
             android:id="@+id/dongman"
             android:textColor="@color/navigation_title_color"
             android:background="@color/navigationbar_backround_color"
             android:gravity="center"/>
         <TextView
             android:layout_width="match_parent"
             android:layout_height="@dimen/navigationbar_height"
             android:textSize="@dimen/title_fontsize"
             android:text="综艺"
             android:id="@+id/zongyi"
             android:layout_weight="1"
             android:textColor="@color/navigation_title_color"
             android:background="@color/navigationbar_backround_color"
             android:gravity="center"/>
         </LinearLayout>

         <ImageView
             android:layout_width="match_parent"
             android:id="@+id/Imagezhishiqi"
             android:layout_height="3dp"
             android:background="@color/hot_price_color"/>
     </LinearLayout>

    <com.lt.WBTaoBaoKe.custom.xPullRefresh.XListView
        android:id="@+id/xListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:cacheColorHint="#00000000">
    </com.lt.WBTaoBaoKe.custom.xPullRefresh.XListView>
</LinearLayout>

下面贴代码,有动画说明的详细注视

public class HomeFragment_VideoActivity extends Activity implements View.OnClickListener {

    private ListViewAdapter listViewAdapter;
    private ViewPagerAdapter viewPagerAdapter;
    private Context context;
    private LinearLayout.LayoutParams zhishiqilinearParams;
    private int zhishiqiWidth;
    private ImageView zhishiqi;
    private TextView tuijianView;
    private TextView dianying;
    private TextView dianshi;
    private TextView dongman;
    private TextView zongyi;
    private int currentTopItemIndex;
    private TranslateAnimation moveAnimation;
    private int moveStepValue;

    //视频数据
    private XListView listView;
    private JSONArray CurrentVideoDataArray;
    private int currentVideoPageIndex;
    private String refreshTime = "第一次刷新";
    private ViewGroup.MarginLayoutParams margin;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getApplicationContext();
        setContentView(R.layout.home_video_activity);
        //指示器
        zhishiqi = (ImageView) findViewById(R.id.Imagezhishiqi);
        currentTopItemIndex = 1;
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;
        //由于我们分段是固定的5段,所以这里先使用手机屏幕宽度/5,计算出分段指示器的宽度
        zhishiqiWidth = width / 5;
        //由于在固定布局中无法准确设置出指示器的宽度,所以这里需要使用计算出的宽度重新设置指示器宽度
        zhishiqilinearParams = (LinearLayout.LayoutParams) zhishiqi.getLayoutParams();
        zhishiqilinearParams.width = zhishiqiWidth;
        zhishiqi.setLayoutParams(zhishiqilinearParams);
        //下面都是每个分段里面显示文字的textview控件
        tuijianView = (TextView) findViewById(R.id.tuijianVideo);
        dianying = (TextView) findViewById(R.id.dianying);
        dianshi = (TextView) findViewById(R.id.dianshi);
        dongman = (TextView) findViewById(R.id.dongman);
        zongyi = (TextView) findViewById(R.id.zongyi);

        tuijianView.setTag(1);
        dianying.setTag(2);
        dianshi.setTag(3);
        dongman.setTag(4);
        zongyi.setTag(5);

        tuijianView.setOnClickListener(this);
        dianying.setOnClickListener(this);
        dianshi.setOnClickListener(this);
        dongman.setOnClickListener(this);
        zongyi.setOnClickListener(this);

    }

    //每个分段textview点击事件
    @Override
    public void onClick(View v) {

        int tag = (Integer) v.getTag();

        //获得控件移动的段数确定移动方向,如果是正数表示向右移动,负数左移动
        moveStepValue = tag - currentTopItemIndex;

        switch (tag) {
            case 1:
                if (currentTopItemIndex == 1) {
                    return;
                } else {
                    currentTopItemIndex = tag;

                    tuijianView.setTextColor(this.getResources().getColor(R.color.hot_price_color));

                    dianying.setTextColor(this.getResources().getColor(R.color.white_color));
                    dianshi.setTextColor(this.getResources().getColor(R.color.white_color));
                    dongman.setTextColor(this.getResources().getColor(R.color.white_color));
                    zongyi.setTextColor(this.getResources().getColor(R.color.white_color));

                }
                break;

            case 2:
                if (currentTopItemIndex == 2) {
                    return;
                } else {
                    currentTopItemIndex = tag;

                    tuijianView.setTextColor(this.getResources().getColor(R.color.white_color));

                    dianying.setTextColor(this.getResources().getColor(R.color.hot_price_color));
                    dianshi.setTextColor(this.getResources().getColor(R.color.white_color));
                    dongman.setTextColor(this.getResources().getColor(R.color.white_color));
                    zongyi.setTextColor(this.getResources().getColor(R.color.white_color));

                }
                break;

            case 3:
                if (currentTopItemIndex == 3) {
                    return;
                } else {
                    currentTopItemIndex = tag;

                    tuijianView.setTextColor(this.getResources().getColor(R.color.white_color));

                    dianying.setTextColor(this.getResources().getColor(R.color.white_color));
                    dianshi.setTextColor(this.getResources().getColor(R.color.hot_price_color));
                    dongman.setTextColor(this.getResources().getColor(R.color.white_color));
                    zongyi.setTextColor(this.getResources().getColor(R.color.white_color));
                }
                break;
            case 4:
                if (currentTopItemIndex == 4) {
                    return;
                } else {
                    currentTopItemIndex = tag;

                    tuijianView.setTextColor(this.getResources().getColor(R.color.white_color));

                    dianying.setTextColor(this.getResources().getColor(R.color.white_color));
                    dianshi.setTextColor(this.getResources().getColor(R.color.white_color));
                    dongman.setTextColor(this.getResources().getColor(R.color.hot_price_color));
                    zongyi.setTextColor(this.getResources().getColor(R.color.white_color));
                }
                break;

            default:
                if (currentTopItemIndex == 5) {
                    return;
                } else {
                    currentTopItemIndex = tag;
                    tuijianView.setTextColor(this.getResources().getColor(R.color.white_color));
                    dianying.setTextColor(this.getResources().getColor(R.color.white_color));
                    dianshi.setTextColor(this.getResources().getColor(R.color.white_color));
                    dongman.setTextColor(this.getResources().getColor(R.color.white_color));
                    zongyi.setTextColor(this.getResources().getColor(R.color.hot_price_color));
                }
                break;

        }
        margin = new ViewGroup.MarginLayoutParams(tuijianView.getLayoutParams());
        //Animation.RELATIVE_TO_SELF,  0.0f,这两个其实是一个参数(合并一起看,表示相对定位+坐标变动值),所以只看2/4/6/8这4个参数
       //第一个值:0.0f表示控件的原始x坐标不变动。
        //第二个值moveStepValue*0.5f表示原始x坐标前提下变动的值
        //第三个值0.0f表示y坐标变动
        //第四个值0.0f表示原始y坐标前提下变动的值
        //重点:这里由于我们只是x坐标左右移动,所以y轴的值一只不变动0.0f 0.0f
        //当moveStepValue为负数时,moveStepValue*0.5f segment是往左移动,正数往右移动,这样动画效果才不会有bug,
        moveAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,
                Animation.RELATIVE_TO_SELF, moveStepValue * 0.5f, Animation.RELATIVE_TO_SELF,
                0.0f, Animation.RELATIVE_TO_SELF, 0.0f);

        //下面的代码是计算动画的执行时间,如果不计算就会出现切换分段数量不一致,指示器的动画执行速度太快或太慢。

        if (moveStepValue < 1) {
            moveStepValue = moveStepValue * -1;
        }
        moveAnimation.setDuration(moveStepValue * 70);
        moveAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {

                zhishiqi.clearAnimation();

                //移动效果实现之后,还需要将移动segment分段的margin设置一次,如果不设置动画又会反回去,为什么这样我觉得应该是和android是使用xhtml布局的原因。
                zhishiqilinearParams.setMargins((currentTopItemIndex - 1) * zhishiqiWidth, margin.topMargin, zhishiqiWidth, zhishiqilinearParams.height);
                zhishiqi.setLayoutParams(zhishiqilinearParams);

            }
        });

        zhishiqi.startAnimation(moveAnimation);
        zhishiqi.setVisibility(View.VISIBLE);
    }
}
时间: 2025-01-06 05:48:05

android TranslateAnimation 顶部segment分段移动动画的相关文章

Android开发之Tween(补间动画)完全解析(下)

欢迎转载,转载请注明出处:http://blog.csdn.net/dmk877/article/details/51980734 在上一篇文章中,我们详细讨论了Tween动画的xml的实现以及interpolator的使用,相信通过上篇文章大家对Tween动画的xml属性的配置会有一个详细的理解,当然这篇文章也是承接上篇文章,所以强烈建议先阅读上篇文章:Android开发之Tween(补间动画)完全解析(上),这篇文章将从代码的角度实现上篇文章的效果.如有疑问请留言,如有谬误欢迎批评指正. T

android一个弹出菜单的动画(一)

先上效果图: 先写Layout文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent&quo

【转】android 自定义ViewPager,修改原动画

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPager的切换效果觉得枯燥,形成了审美疲劳~~我们需要改变,今天教大家如何改变ViewPager 切换时的效果,实现个性化的图片切换~~ 看一下这样效果的图片切换: 是

Android UI- PullToRrefresh自定义下拉刷新动画

Android UI- PullToRrefresh自定义下拉刷新动画 如果觉得本文不错,麻烦投一票,2014年博客之星投票地址:http://vote.blog.csdn.net/blogstar2014/details?username=wwj_748#content 本篇博文要给大家分享的是如何使用修改开源项目PullToRrefresh下拉刷新的动画,来满足我们开发当中特定的需求,我们比较常见的一种下拉刷新样式可能是以下这种: 就是下拉列表的时候两个箭头上下翻转,更改日期文本和刷新状态,

转Android 用Animation-list实现逐帧动画

Android 用Animation-list实现逐帧动画 第一步:先上图片素材,以下素材放到res/drawable目录下: http://blog.csdn.net/aminfo/article/details/7847761 图片素材: 文件名称: icon1.png icon2.png icon3.png icon4.png icon5.png icon6.png 第二步:上动画Animation-list帧布局文件,有2个,一个是按顺序显示动画,一个是倒序显示动画,文件存放在res/d

Android研究之游戏开发帧动画实现

 1.帧动画的原理        帧动画帧动画顾名思义,一帧一帧播放的动画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一帧的切换罢了.对摄像头不清楚的请看Android研究之游戏开发摄像头更新        如图所示:人物行走动画的实现方式, 4帧行走动画在播放区域 一帧一帧向左切换播放 给人们一种播放动画的假象 ,图片就动了起来, 很简单吧,其它三方向播放动画的方法类似我就不再一一举例.

[Swift通天遁地]九、拔剑吧-(3)创建多种自定义Segment分段样式的控件

本文将演示创建多种自定义Segment分段样式的控件. 首先确保已经安装了所需的第三方类库.双击查看安装配置文件[Podfile] 1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'PagingMenuController' 7 end 根据配置文件中的相关设置,安装第三方类库. 安装完成之后,双击打开

[Swift通天遁地]九、拔剑吧-(4)使用开源类库创建可滑动的Segment分段控件

本文将演示创建多种自定义Segment分段样式的控件. 首先确保已经安装了所需的第三方类库.双击查看安装配置文件[Podfile] 1 platform :ios, ‘12.0’ 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'TwicketSegmentedControl' 7 end 根据配置文件中的相关设置,安装第三方类库. 安装完成之后,双

Android开发 navigation的跳转动画实现

前言 此篇博客只简短的介绍navigation如何添加跳转页面的动画属性,如果你还为接触了解过navigation.建议你看我另一篇博客Android开发 navigation入门详解 创建动画xml in_from_right.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android&