首页通知上下翻滚效果的实现

首先看下效果图,淘宝的首页通知和demo的对比。
这里写图片描述
这里写图片描述

实现思路:用平移动画效果,首先textview执行显示位置向上平移的动画,监听动画结束时,改变text,然后设置从底部向上平移到显示位置的动画,循环执行就行。
1.定义动画和通知类
view_out.xml从当前显示的位置上移的动画

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromYDelta="0%p"
    android:interpolator="@android:anim/linear_interpolator"
    android:toYDelta="-50%p" >
</translate>

view_in.xml从底部向上平移的动画

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromYDelta="0%p"
    android:interpolator="@android:anim/linear_interpolator"
    android:toYDelta="-50%p" >
</translate>

定义通知类Top,包括title和content,实际开发中一般通过解析接口数据获得

public class Top {
    private String title = "";
    private String content = "";
}

2.布局文件 activity_main.xml,RoundTextView是自定义的带框的textview,由于动画相对的是父控件的位置,所以父控件要指定高度或者使用wrap_content。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:liushen="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"

    >

    <LinearLayout
        android:id="@+id/layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <com.liushen.textviewscroll.view.RoundTextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:textColor="#ff0000" />

        <TextView
            android:id="@+id/content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            />
    </LinearLayout>
</LinearLayout>

3.初始化数据,实际开发解析后台数据获得

private void initDate() {
    Top top1 = new Top("最新","111111111111111111111");
    Top top2 = new Top("置顶","22222222222222222222222222222");
    Top top3 = new Top("活动","333333333333333333333333333");
     ArrayList<Top> tops = new ArrayList<>();
    tops.add(top1);
    tops.add(top2);
    tops.add(top3);
    layout.setDate(tops);
}

4.定义Handler,监听view_out.xml动画执行完成后改变text,执行从底部向上的动画。

Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        initAnim();
        animationOut.setAnimationListener(new Animation.AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                title.setText(tops.get(index).getTitle());
                content.setText(tops.get(index).getContent());
                layout.startAnimation(animationIn);
            }
        });
        layout.startAnimation(animationOut);

        super.handleMessage(msg);
    }
};

5.定义Thread循环调用

public class MyThread implements Runnable {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (scroll) {
            try {
                Log.i("liushen","scroll");
                Thread.sleep(3000);
                if (index < tops.size()-1) {
                    index++;
                } else {
                    index = 0;
                }
                Message message = new Message();
                handler.sendMessage(message);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

6.onResume方法开启线程,onPause方法结束线程,不然会一直循环调用。

@Override
protected void onResume() {
    scroll = true;
    new Thread(new MyThread()).start();
    super.onResume();
}

@Override
protected void onPause() {
    scroll = false;
    super.onPause();
}

demo另外有个自定义了LinearLayout,把实现逻辑写在里面,提供了setData方法,可以很方便的使用。

点击下载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值