这是一个可以无限滚动的顶部公告。
Java代码RollAdvertise.jave:
package com.example.jun.testmybanner.fragment;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Interpolator;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Scroller;
import com.example.jun.testmybanner.R;
import com.facebook.drawee.view.SimpleDraweeView;
import java.lang.reflect.Field;
import java.util.Timer;
import java.util.TimerTask;
public class RollAdvertise extends Fragment implements ViewPager.OnPageChangeListener {
private View mLayoutView;
private ViewPager viewPager;
private ViewGroup group;
private String[] urlArray; //所有的图片资源的URL
private SimpleDraweeView[] sdvArray; //装所有图片的
private ImageView[] tipsArray; //装点点的ImageView数组
private String[] webViewUrlArray; //点击item后进入的webview
private int arrNum = 0;
private int focusedId = 0;
private int unfocusedId = 0;
private int animationTime = 500; //动画的时间
private int intervalTime = 2000; //动画时间与间隔的时间一起的时间
private Handler handler = null;
private Timer timer = null;
private TimerTask task = null;
private Field field = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mLayoutView = inflater.inflate(R.layout.fragment_roll_advertise, container, false);
initData();
return mLayoutView;
}
@Override
public void onPause() {
super.onPause();
}
public void setAllUrl(String[] urlArray, String[] webViewUrlArray, int focused, int unfocused) {
this.urlArray = urlArray;
arrNum = this.urlArray.length;
if (webViewUrlArray != null && webViewUrlArray.length != 0) {
if (webViewUrlArray.length == 1) {
this.webViewUrlArray = new String[4];
this.webViewUrlArray[0] = webViewUrlArray[0];
this.webViewUrlArray[1] = webViewUrlArray[0];
this.webViewUrlArray[2] = webViewUrlArray[0];
this.webViewUrlArray[3] = webViewUrlArray[0];
} else if (webViewUrlArray.length == 2) {
this.webViewUrlArray = new String[4];
this.webViewUrlArray[0] = webViewUrlArray[0];
this.webViewUrlArray[1] = webViewUrlArray[1];
this.webViewUrlArray[2] = webViewUrlArray[0];
this.webViewUrlArray[3] = webViewUrlArray[1];
} else {
this.webViewUrlArray = webViewUrlArray;
}
}
focusedId = focused;
unfocusedId = unfocused;
initRoll();
startTimer(); //启动动画
}
public void initRoll() {
if (urlArray.length == 0 || focusedId == 0 | unfocusedId == 0) {
return;
}
//将点点加入到ViewGroup中
tipsArray = new ImageView[arrNum];
for (int i = 0; i < tipsArray.length; i++) {
ImageView imageView = new ImageView(getActivity());
imageView.setLayoutParams(new ViewGroup.LayoutParams(10, 10));
tipsArray[i] = imageView;
if (i == 0) {
tipsArray[i].setBackgroundResource(focusedId);
} else {
tipsArray[i].setBackgroundResource(unfocusedId);
}
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
layoutParams.leftMargin = 5;
layoutParams.rightMargin = 5;
group.addView(imageView, layoutParams);
}
//将图片装载到数组中
if (arrNum == 1) {
sdvArray = new SimpleDraweeView[4];
for (int i = 0; i < sdvArray.length; i++) {
SimpleDraweeView sdv = new SimpleDraweeView(getActivity());
sdvArray[i] = sdv;
sdv.setImageURI(Uri.parse(urlArray[0]));
}
} else if (arrNum == 2) {
sdvArray = new SimpleDraweeView[4];
for (int i = 0; i < sdvArray.length; i++) {
SimpleDraweeView sdv = new SimpleDraweeView(getActivity());
sdvArray[i] = sdv;
sdv.setImageURI(Uri.parse(urlArray[i % 2]));
}
} else {
sdvArray = new SimpleDraweeView[arrNum];
for (int i = 0; i < sdvArray.length; i++) {
SimpleDraweeView sdv = new SimpleDraweeView(getActivity());
sdvArray[i] = sdv;
sdv.setImageURI(Uri.parse(urlArray[i]));
}
}
for (int i = 0; i < sdvArray.length; i++) {
sdvArray[i].setId(i);
sdvArray[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("kk", v.getId() + "");
}
});
}
//设置Adapter
viewPager.setAdapter(new MyAdapter());
//设置监听,主要是设置点点的背景
viewPager.setOnPageChangeListener(this);
//设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动
viewPager.setCurrentItem((sdvArray.length) * 100);
try {
field = ViewPager.class.getDeclaredField("mScroller");
field.setAccessible(true);
FixedSpeedScroller scroller = new FixedSpeedScroller(viewPager.getContext(),
new AccelerateInterpolator());
field.set(viewPager, scroller);
scroller.setmDuration(animationTime);
} catch (Exception e) {
e.printStackTrace();
}
}
private void initData() {
group = (ViewGroup) mLayoutView.findViewById(R.id.viewGroup);
viewPager = (ViewPager) mLayoutView.findViewById(R.id.viewPager);
handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
try {
viewPager.setCurrentItem((viewPager.getCurrentItem() + 1), true);
} catch (Exception e) {
e.printStackTrace();
}
}
super.handleMessage(msg);
}
};
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
stopTimer(); //暂停动画
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
startTimer(); //启动动画
break;
}
return false;
}
});
}
public class MyAdapter extends PagerAdapter {
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView(sdvArray[position % sdvArray.length]);
}
/**
* 载入图片进去,用当前的position 除以 图片数组长度取余数是关键
*/
@Override
public Object instantiateItem(View container, int position) {
try {
((ViewPager) container).addView(sdvArray[position % sdvArray.length], 0);
} catch (Exception e) {
e.printStackTrace();
}
return sdvArray[position % sdvArray.length];
}
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
setImageBackground(arg0 % arrNum);
}
/**
* 设置选中的tip的背景
*
* @param selectItems
*/
private void setImageBackground(int selectItems) {
for (int i = 0; i < tipsArray.length; i++) {
if (i == selectItems) {
tipsArray[i].setBackgroundResource(focusedId);
} else {
tipsArray[i].setBackgroundResource(unfocusedId);
}
}
}
public class FixedSpeedScroller extends Scroller {
private int mDuration = 1500;
public FixedSpeedScroller(Context context) {
super(context);
}
public FixedSpeedScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
// Ignore received duration, use fixed one instead
super.startScroll(startX, startY, dx, dy, mDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
// Ignore received duration, use fixed one instead
super.startScroll(startX, startY, dx, dy, mDuration);
}
public void setmDuration(int time) {
mDuration = time;
}
public int getmDuration() {
return mDuration;
}
}
public void stopTimer() {
if (timer != null) {
timer.cancel();
timer = null;
}
if (task != null) {
task.cancel();
task = null;
}
}
public void startTimer() {
if (timer == null) {
timer = new Timer();
}
if (task == null) {
task = new TimerTask() {
@Override
public void run() {
// 需要做的事:发送消息
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
}
if (timer != null && task != null)
timer.schedule(task, intervalTime, intervalTime); // 0s后执行task,经过intervalTime秒再次执行
}
}
这是一个fragment,大家可以直接放到自己的工程中。
代码中的SimpleDraweeView是一个Facebook提供的一个加载图片的控件,大家也可以直接使用ImageView。
使用代码MainActivity.java:
package com.example.jun.testmybanner;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import com.example.jun.testmybanner.fragment.RollAdvertise;
import com.facebook.drawee.view.SimpleDraweeView;
public class MainActivity extends AppCompatActivity {
private SimpleDraweeView sdvTest;
private RollAdvertise fRoll;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sdvTest = (SimpleDraweeView) findViewById(R.id.sdvTest);
sdvTest.setImageURI(Uri.parse("http://scimg.jb51.net/allimg/160317/14-16031G13220936.jpg"));
FragmentManager fragmentManager = this.getSupportFragmentManager();
fRoll = (RollAdvertise) fragmentManager.findFragmentById(R.id.fRoll);
String allUrl[] = new String[]{
"http://img3.imgtn.bdimg.com/it/u=2546610023,3120506294&fm=11&gp=0.jpg",
"http://pic32.nipic.com/20130814/13162234_111708002000_2.jpg",
"http://pic54.nipic.com/file/20141204/19902974_135858226000_2.jpg",
"http://img03.tooopen.com/images/20131102/sy_45238929299.jpg",
};
fRoll.setAllUrl(allUrl, null, R.drawable.page_indicator_focused, R.drawable.page_indicator_unfocused);
}
}
sdvTest = (SimpleDraweeView) findViewById(R.id.sdvTest);
sdvTest.setImageURI(Uri.parse("http://scimg.jb51.net/allimg/160317/14-16031G13220936.jpg"));
是介绍怎么使用SimpleDraweeView的,下面是怎么使用该fragment的。
fragment的fragment_roll_advertise.xml代码为:
<pre name="code" class="html"><FrameLayout 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"
tools:context="com.example.jun.testmybanner.fragment.RollAdvertise">
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/viewGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
android:gravity="center_horizontal"
android:orientation="horizontal"></LinearLayout>
</RelativeLayout>
</FrameLayout>
activity_main.xml文件:
<FrameLayout 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"
tools:context="com.example.jun.testmybanner.fragment.RollAdvertise">
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/viewGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
android:gravity="center_horizontal"
android:orientation="horizontal"></LinearLayout>
</RelativeLayout>
</FrameLayout>