if (activity==null){
//Activity已经回收,无需再处理UI了
return ;
}
//检查消息队列并移除未发送的消息,这主要是避免在复杂环境下消息出现重复等问题。
if (activity.handler.hasMessages(MSG_UPDATE_IMAGE)){
activity.handler.removeMessages(MSG_UPDATE_IMAGE);
}
switch (msg.what) {
case MSG_UPDATE_IMAGE:
currentItem++;
activity.viewPager.setCurrentItem(currentItem);
//准备下次播放
activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
break;
case MSG_KEEP_SILENT:
//只要不发送消息就暂停了
break;
case MSG_BREAK_SILENT:
activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
break;
case MSG_PAGE_CHANGED:
//记录当前的页号,避免播放的时候页面显示不正确。
currentItem = msg.arg1;
break;
default:
break;
}
}
}
集成代码:MainActivity
下面是MainActivity的代码,主要是加载View和对ViewPager进行初始化设置:
public class MainActivity extends Activity {
private static final String LOG_TAG = “MainActivity”;
private ImageHandler handler = new ImageHandler(new WeakReference(this));
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化iewPager的内容
viewPager = (ViewPager) findViewById(R.id.main_viewpager);
LayoutInflater inflater = LayoutInflater.from(this);
ImageView view1 = (ImageView) inflater.inflate(R.layout.item, null);
ImageView view2 = (ImageView) inflater.inflate(R.layout.item, null);
ImageView view3 = (ImageView) inflater.inflate(R.layout.item, null);
view1.setImageResource(R.drawable.ics);
view2.setImageResource(R.drawable.jellybean);
view3.setImageResource(R.drawable.kitkat);
ArrayList views = new ArrayList();
views.add(view1);
views.add(view2);
views.add(view3);
viewPager.setAdapter(new ImageAdapter(views));
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
//配合Adapter的currentItem字段进行设置。
@Override
public void onPageSelected(int arg0) {
handler.sendMessage(Message.obtain(handler, ImageHandler.MSG_PAGE_CHANGED, arg0, 0));
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
//覆写该方法实现轮播效果的暂停和恢复
@Override
public void onPageScrollStateChanged(int arg0) {
switch (arg0) {
case ViewPager.SCROLL_STATE_DRAGGING:
handler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);
break;
case ViewPager.SCROLL_STATE_IDLE:
handler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);
break;
default:
break;
}
}
});
viewPager.setCurrentItem(Integer.MAX_VALUE/2);//默认在中间,使用户看不到边界
//开始轮播效果
handler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);
}//end of onCreate
}//end of MainActivity
二、Gallery(deprecated) + Timer
package com.zms.demo2;
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.Gallery;
public class MyGallery extends Gallery
{
/**
-
这里的数值,限制了每次滚动的最大长度,图片宽度为480PX。这里设置600效果好一些。 这个值越大,滚动的长度就越大。
-
也就是会出现一次滚动跨多个Image。这里限制长度后,每次滚动只能跨一个Image
*/
private static final int timerAnimation = 1;
private final Handler mHandler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
switch (msg.what)
{
case timerAnimation:
int position = getSelectedItemPosition();
Log.i(“msg”, “position:”+position);
if (position >= (getCount() - 1))
{
onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null);
} else
{
onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
}
break;
default:
break;
}
};
};
private final Timer timer = new Timer();
private final TimerTask task = new TimerTask()
{
public void run()
{
mHandler.sendEmptyMessage(timerAnimation);
}
};
public MyGallery(Context paramContext)
{
super(paramContext);
timer.schedule(task, 3000, 3000);
}
public MyGallery(Context paramContext, AttributeSet paramAttributeSet)
{
super(paramContext, paramAttributeSet);
timer.schedule(task, 3000, 3000);
}
public MyGallery(Context paramContext, AttributeSet paramAttributeSet,
int paramInt)
{
super(paramContext, paramAttributeSet, paramInt);
timer.schedule(task, 3000, 3000);
}
private boolean isScrollingLeft(MotionEvent paramMotionEvent1,
MotionEvent paramMotionEvent2)
{
float f2 = paramMotionEvent2.getX();
float f1 = paramMotionEvent1.getX();
if (f2 > f1)
return true;
return false;
}
public boolean onFling(MotionEvent paramMotionEvent1,
MotionEvent paramMotionEvent2, float paramFloat1, float paramFloat2)
{
int keyCode;
if (isScrollingLeft(paramMotionEvent1, paramMotionEvent2))
{
keyCode = KeyEvent.KEYCODE_DPAD_LEFT;
} else
{
keyCode = KeyEvent.KEYCODE_DPAD_RIGHT;
}
onKeyDown(keyCode, null);
return true;
}
public void destroy()
{
timer.cancel();
}
}
三、ImageView + CountDownTimer
package com.zms.demo3;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.R.integer;
import android.app.Activity;
import android.content.Intent;
import android.content.Loader.ForceLoadContentObserver;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ImageView imageView;
更多Android高级工程师进阶学习资料
进阶学习视频
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
)]
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-2oSGDor6-1714044036648)]
里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!