近期在弄个项目。要求有跑马灯效果的图片展示。

网上搜了一堆,都没有完美实现的算了还是自己写吧!

实现原理利用 ViewPager 控件,这个控件本身就支持滑动翻页非常好非常强大好多功能都能用上它。利用mViewPager.setCurrentItem(currentIndex); 来实现切换当前显示的view

在加一个定时器不断设置setCurrentItem 来实现跑马灯效果。

一。主要实现类 凝视非常具体了 一看就知道了

package com.example.marqueeimage;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import com.example.marqueeimage.adapter.MarqueeAdapter;
import com.example.marqueeimage.transforms.ABaseTransformer;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.widget.ImageView;
import android.widget.LinearLayout; public class MarqueeImage extends LinearLayout{ private ViewPager mViewPager;
private ArrayList<View> mPageViewList=new ArrayList<View>();//数据�?
private ImageView mImageView;
private ImageView[] mImageViews;
//主布�? ��部指示当前页面的小圆点视图,LinearLayout
private ViewGroup indicatorViewGroup;
private LayoutInflater mInflater;//定义LayoutInflater
private MarqueeAdapter marqueeAdapter;//适配�? private Timer mTimer=null;//定时�?
public int currentIndex=0;//当前显示View页面的序号
private Handler mHandler;//处理更换图片消息
private FixedSpeedScroller scroller=null;
private Context mContext; public MarqueeImage(Context context) {
super(context);
init(context);
}
public MarqueeImage(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context){
mContext=context;
LayoutInflater.from(mContext).inflate(R.layout.marquee_image, this);
mViewPager = (ViewPager) findViewById(R.id.marquee_image_viewpager);
indicatorViewGroup = (ViewGroup) findViewById(R.id.marquee_image_bottomviewgroup);
mViewPager.setOnPageChangeListener(new pageChangeListener());
mViewPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN){
stopAutoScroller();
setScrollerTime(100);
}else if(event.getAction()==MotionEvent.ACTION_UP){
startAutoScroller();
}
return false;
}
});
marqueeAdapter=new MarqueeAdapter();
mViewPager.setAdapter(marqueeAdapter);
initHandle();
} /**
* 设置滑动动画
* mViewPager.setPageTransformer(true,new CubeOutTransformer());
mViewPager.setPageTransformer(true,new AccordionTransformer());
mViewPager.setPageTransformer(true,new FlipHorizontalTransformer());
mViewPager.setPageTransformer(true,new RotateUpTransformer());
mViewPager.setPageTransformer(true,new ZoomOutTranformer());
mViewPager.setPageTransformer(true,new ZoomOutSlideTransformer());
mViewPager.setPageTransformer(true,new TabletTransformer());
*/
public void setScrollerAnimation(ABaseTransformer animation){
mViewPager.setPageTransformer(true,animation);
}
/**
* 開始自己主动滚动
*/
public boolean startAutoScroller(){
return startTime();
}
/**
* 停止自己主动滚动
*/
public boolean stopAutoScroller(){
if(mTimer!=null){
mTimer.cancel();
mTimer=null;
return true;
}else{
return false;
}
}
/**
* 初始化Handle
*/
public void initHandle(){
mHandler = new Handler() {
@SuppressLint("NewApi") public void handleMessage(Message msg) {
if(msg.what==1){
setScrollerTime(700);
mViewPager.setCurrentItem(currentIndex);
if(mPageViewList.size()-1==currentIndex){
currentIndex=0;
}else{
currentIndex++;
}
}
};
};
}
/**
* 设置滑动时间
*/
public void setScrollerTime(int scrollerTime){
try {
if(scroller!=null){
scroller.setTime(scrollerTime);
}else{
Field mScroller;
mScroller = ViewPager.class.getDeclaredField("mScroller");
mScroller.setAccessible(true);
scroller= new FixedSpeedScroller(mViewPager.getContext(),new AccelerateInterpolator());
scroller.setTime(scrollerTime);
mScroller.set(mViewPager, scroller);
}
} catch (Exception e) {
}
}
/**
* 创建底部的导航条
*/
public void createNavBar(){
mImageViews = new ImageView[mPageViewList.size()];
for (int i = 0; i < mImageViews.length; i++) {
mImageView = new ImageView(mContext);
mImageView.setLayoutParams(new LayoutParams(20,20));
mImageView.setPadding(20, 0, 20, 0);
if (i == 0) {
mImageView.setBackgroundResource(R.drawable.page_indicator_focused);
} else {
mImageView.setBackgroundResource(R.drawable.page_indicator);
} mImageViews[i] = mImageView; //把指示作用的远点图片加入底部的视图中
indicatorViewGroup.addView(mImageViews[i]);
}
} class pageChangeListener implements OnPageChangeListener{
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
for (int i = 0; i < mImageViews.length; i++) {
if(i == arg0) {
mImageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);
} else {
mImageViews[i].setBackgroundResource(R.drawable.page_indicator);
}
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub }
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub }
}
/**
* 启动计时
*/
private boolean startTime(){
if(mTimer==null){
mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
Message msg=new Message();
msg.what=1;
mHandler.sendMessage(msg);
}
},2000,2000); //每2秒运行一次
return true;
}else{
return false;
}
}
/**
* 设置数据
* @param mPageViews
*/
public void setData(ArrayList<View> pageViewList){
if(pageViewList!=null){
this.mPageViewList=pageViewList;
marqueeAdapter.setData(mPageViewList);//加入数据
marqueeAdapter.notifyDataSetChanged();//通知数据发生改变�?
createNavBar();//依据数据。创建导航条
}
}
/**
* 清理所有数据
*/
public void clearData(){
if(this.mPageViewList!=null){
this.mPageViewList.clear();
}
mViewPager.removeAllViews();
indicatorViewGroup.removeAllViews();
}
}

 二。

ViewPager的适配器也非常easy

    

package com.example.marqueeimage.adapter;

import java.util.ArrayList;

import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View; /**
* @author fcm
* @Create at 2013-8-27 下午2:48:34
* @Version 1.0
* <p>
Features draft description.
主要功能介绍
</p>
*/
public class MarqueeAdapter extends PagerAdapter{
private ArrayList<View> mPageViews=new ArrayList<View>(); /**
* 加入数据
* @param mPageViews
*/
public void setData(ArrayList<View> mPageViews){
this.mPageViews=mPageViews;
}
@Override
public int getCount() {
return mPageViews.size();
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
} @Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return super.getItemPosition(object);
} @Override
public void destroyItem(View arg0, int arg1, Object arg2) {
// TODO Auto-generated method stub
((ViewPager) arg0).removeView(mPageViews.get(arg1));
} @Override
public Object instantiateItem(View arg0, int arg1) {
// TODO Auto-generated method stub
((ViewPager) arg0).addView(mPageViews.get(arg1));
return mPageViews.get(arg1);
} @Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
// TODO Auto-generated method stub } @Override
public Parcelable saveState() {
// TODO Auto-generated method stub
return null;
} @Override
public void startUpdate(View arg0) {
// TODO Auto-generated method stub } @Override
public void finishUpdate(View arg0) {
// TODO Auto-generated method stub } }

三。

控制滑动速度  这个非常重要 设置自己主动滚动默认的速度的非常快 效果非常差,用FixedSpeedScroller继承Scroller来实现控制viewpaper滑动速度 这部分来自网络

     

package com.example.marqueeimage;

import android.annotation.SuppressLint;
import android.content.Context;
import android.view.animation.Interpolator;
import android.widget.Scroller; public class FixedSpeedScroller extends Scroller { private int mDuration =500; public void setTime(int scrollerTime){
mDuration=scrollerTime;
}
public FixedSpeedScroller(Context context) {
super(context);
} public FixedSpeedScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
} @SuppressLint("NewApi") public FixedSpeedScroller(Context context, Interpolator interpolator, boolean flywheel) {
super(context, interpolator, flywheel);
} @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);
}
}

四。

布局文件:

  

<?xml version="1.0" encoding="utf-8"?

>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/marquee_image_layout"
android:orientation="vertical"> <!--拖动 -->
<android.support.v4.view.ViewPager
android:id="@+id/marquee_image_viewpager"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
/>
<LinearLayout
android:id="@+id/marquee_image_bottomviewgroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal" >
</LinearLayout> </LinearLayout>

五。

最后一步就是改动默认动画,实现比較绚丽的效果 这部分来自网络 大约有10种左右动画吧

     

    源代码下载地址:http://download.csdn.net/download/nn955/7465547

android ViewPager实现 跑马灯切换图片+多种切换动画的更多相关文章

  1. 【Android】TextView跑马灯效果

    老规矩,先上图看效果. 说明 TextView的跑马灯效果也就是指当你只想让TextView单行显示,可是文本内容却又超过一行时,自动从左往右慢慢滑动显示的效果就叫跑马灯效果. 其实,TextView ...

  2. android中实现跑马灯效果以及AutoCompleteTestView与MultiAutoCompleteTextView的学习

    跑马灯效果 1.用过属性的方式实现跑马灯效果 属性:                  android:singleLine="true" 这个属性是设置TextView文本中文字 ...

  3. android:ellipsize实现跑马灯效果总结(转)

      最近无意间看到了涉及到跑马灯效果的代码,于是在网上查阅了很多资料,在这里对自己看的一些文章进行一下总结,顺便加上自己的一些体会. 让我们一步步逐渐向下. 首先我们要实现走马灯这样一个效果,通常来说 ...

  4. C#跑马灯,图片滚动,后台获取图片地址。动态绑定图片,imag显示文字

    下面附下载地址. http://download.csdn.net/download/njxiaogui/10002058 1.跑马灯效果,图片连续循环滚动,图片下面并可附文字描述,图片是从数据库中获 ...

  5. android:ellipsize实现跑马灯效果总结

    最近无意间看到了涉及到跑马灯效果的代码,于是在网上查阅了很多资料,在这里对自己看的一些文章进行一下总结,顺便加上自己的一些体会. 让我们一步步逐渐向下. 首先我们要实现走马灯这样一个效果,通常来说都是 ...

  6. Android:TextView文字跑马灯的效果实现

    解决TextView文字显示不全的问题. 简单设置跑马灯的效果: <TextView android:id="@+id/textView" android:layout_wi ...

  7. iOS 跑马灯带图片可点击

    项目中有个需求,需要以跑马灯的形势滚动展示用户的实时数据,跑马灯需要有用户头像,内容的长度不固定,并且可以点击,滚动效果还要足够流畅,本着不重复造轮子的心理,在网上各种搜索,发现都没法找到满足需求的d ...

  8. Android TextView实现跑马灯

    TextView实现跑马灯的效果:例子一: 这个例子可以解决给一个TextView实现跑马灯的效果,但是不能解决给所有的TextView实现跑马灯的效果. <TextView android:l ...

  9. Android 自定义View跑马灯效果(一)

    今天通过书籍重新复习了一遍自定义VIew,为了加强自己的学习,我把它写在博客里面,有兴趣的可以看一下,相互学习共同进步: 通过自定义一个跑马灯效果,来诠释一下简单的效果: 一.创建一个类继承View, ...

随机推荐

  1. [arc086e]snuke line

    题意: 有n个区间,询问对于$1\leq i\leq m$的每个i,有多少个区间至少包含一个i的倍数? $1\leq N\leq 3\times 10^5$ $1\leq M\leq 10^5$ 题解 ...

  2. POJ-3660 Cow Contest Floyd传递闭包的应用

    题目链接:https://cn.vjudge.net/problem/POJ-3660 题意 有n头牛,每头牛都有一定的能力值,能力值高的牛一定可以打败能力值低的牛 现给出几头牛的能力值相对高低 问在 ...

  3. Unity Microphone 无限时长录制

    原创文章:转载请标明出处--博客园 Jason_c Unity可以很方便的通过 Microphone.Start()方法来调用麦克风,但是有一个弊端是,必须传入时长,这就很尴尬了,因为大多数时间,我们 ...

  4. 【codeforces 429D】Tricky Function

    [题目链接]:http://codeforces.com/problemset/problem/429/D [题意] 给你n个数字; 让你求出一段区间[l,r] 使得 (r−l)2+(∑rl+1a[i ...

  5. CentOS6.3从光盘安装gcc(更改yum源)[转]

    转自:http://www.linuxidc.com/Linux/2012-11/73826.htm 一.加载光盘镜像 加载本地bin-DVD镜像文件到虚拟机系统,如图所示: 二.更改yum源 1.挂 ...

  6. [Test] Easy automated testing in NodeJS with TestCafe

    Quickly get up and running with sensible automated testing scenarios written in ES6. Installing and ...

  7. Precision and recall From Wiki

    Precision.全部推断为正样本的数量里面,有多少是真正的正样本.就是精确率 Recall.所有的正样本里面,检測到了多少真正的正样本,又称查全率.即所有正样本查找到了多少的比率.

  8. delphi网络函数大全

    {=========================================================================功 能: 网络函数库时 间: 2002/10/02版 ...

  9. bzoj1029: [JSOI2007]建筑抢修(堆+贪心)

    1029: [JSOI2007]建筑抢修 题目:传送门 题解: 一道以前就做过的水题(找个水题签个到嘛...) 很明显就是一道贪心题,这里我们用一个堆来维护 具体看代码吧,很容易YY所以不讲 代码: ...

  10. Android JNI和NDK学习(09)--JNI实例二 传递类对象

    1 应用层代码 NdkParam.java是JNI函数的调用类,它的代码如下:   package com.skywang.ndk; import android.app.Activity; impo ...