其实实现逻辑就是一个自定义的view,在加上指定的动画就可以;
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#f1f1f1"
android:gravity="center_vertical|center_horizontal"
android:text="PonyProject" />
<RelativeLayout
android:id="@+id/noti_real_pre"
android:layout_width="fill_parent"
android:layout_height="60dp"
android:orientation="vertical"
android:paddingLeft="10dp" >
<ImageView
android:id="@+id/adt_type"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginBottom="1px"
android:layout_marginTop="1px"
android:clickable="false"
android:focusable="false"
android:paddingBottom="2dp"
android:paddingLeft="@dimen/dp_5"
android:paddingRight="@dimen/dp_10"
android:paddingTop="2dp"
android:src="@drawable/icon_activity" />
<View
android:id="@+id/mView"
android:layout_width="0.5dp"
android:layout_height="15dp"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/adt_type"
android:background="#e5e5e5"
android:clickable="false"
android:focusable="false" >
</View>
<com.pony.view.UPMarqueeView
android:id="@+id/sl_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/mView"
android:clickable="false"
android:focusable="false" />
</RelativeLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="#cccccc"
/>
</LinearLayout>
显示滚动内容的布局文件:
<?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"
android:orientation="vertical">
<LinearLayout
android:id="@+id/rl"
android:layout_width="match_parent"
android:gravity="center_vertical"
android:layout_height="43dp">
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/title_tv1"
android:ellipsize="end"
android:focusable="false"
android:clickable="false"
android:textColor="@color/check_more_topic"
android:textSize="14sp"
android:maxLines="1" />
<TextView
android:layout_width="wrap_content"
android:layout_toRightOf="@id/sl_activity"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="HOT"
android:focusable="false"
android:clickable="false"
android:textSize="10dip"
android:layout_centerVertical="true"
android:padding="2dp"
android:textColor="#ffffff"
android:background="@drawable/selected_selector"
/>
</LinearLayout>
</LinearLayout>
自定义view文件:
package com.pony.view;
import java.util.List;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ViewFlipper;
import com.pony.R;
/**
* 仿淘宝首页的 淘宝头条滚动的自定义View
*
* Created by mengwei on 2016/7/20.
*/
public class UPMarqueeView extends ViewFlipper {
private Context mContext;
private boolean isSetAnimDuration = false;
private int interval = 3000;
/**
* 动画时间
*/
private int animDuration = 500;
public UPMarqueeView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
private void init(Context context, AttributeSet attrs, int defStyleAttr) {
this.mContext = context;
setFlipInterval(interval);
Animation animIn = AnimationUtils.loadAnimation(mContext, R.anim.anim_marquee_in);
if (isSetAnimDuration) animIn.setDuration(animDuration);
setInAnimation(animIn);
Animation animOut = AnimationUtils.loadAnimation(mContext, R.anim.anim_marquee_out);
if (isSetAnimDuration) animOut.setDuration(animDuration);
setOutAnimation(animOut);
}
/**
* 设置循环滚动的View数组
*
* @param views
*/
public void setViews(final List<View> views) {
if (views == null || views.size() == 0) return;
removeAllViews();
for ( int i = 0; i < views.size(); i++) {
final int position=i;
/**
* 这边的监听事件是对滚动的每一条的点击事件,在使用的时候可以打开,但是在打开的时候会获取此布局的焦点,导致外层的事件不能够点击,所以在使用的时候要注意
*/
// //设置监听回调
// views.get(i).setOnClickListener(new OnClickListener() {
// @Override
// public void onClick(View v) {
// if (onItemClickListener != null) {
// onItemClickListener.onItemClick(position, views.get(position));
// }
// }
// });
addView(views.get(i));
}
startFlipping();
}
//
// /**
// * 点击
// */
// private OnItemClickListener onItemClickListener;
//
// /**
// * 设置监听接口
// * @param onItemClickListener
// */
// public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
// this.onItemClickListener = onItemClickListener;
// }
//
// /**
// * item_view的接口
// */
// public interface OnItemClickListener {
// void onItemClick(int position, View view);
// }
}
主Activity文件:
package com.pony;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.pony.view.UPMarqueeView;
public class MainActivity extends Activity {
private String flag = "log_message";
/**
* 设置显示的view
*/
List<View> views = new ArrayList<View>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UPMarqueeView ts_activity = (UPMarqueeView) findViewById(R.id.sl_activity);
setView();
ts_activity.setViews(views);
}
/**
* 设置布局文件
*/
private void setView() {
for (int i = 0; i < 3; i++) {
final int position = i;
// 设置滚动的单个布局
LinearLayout moreView = (LinearLayout) LayoutInflater.from(MainActivity.this).inflate(R.layout.item_view, null);
// 初始化布局的控件
TextView tv1 = (TextView) moreView.findViewById(R.id.tv1);
// 进行对控件赋值
tv1.setText("Pony第"+i+"个信息");
// 添加到循环滚动数组里面去
views.add(moreView);
}
}
}
源码供大家学习: