您的位置:首页 > 其它

实现安卓图片轮播效果(上)非循环轮播

2016-01-19 17:45 323 查看
这次用Viewpager实现图片轮播效果,但是viewpager无法实现循环轮播的效果,所以呢,先写一个demo吧。

直接上代码:

MainActivity.java:

package com.viewpage;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;

/**
* 程序主入口
*
*/
public class MainActivity extends Activity {

private int currentItem;
private int oldPosition=0;
/**
* 存入图片的List
*/
private List<ImageView> images;
/**
* 存入图片下面的点
*/
private List<View> dots;
/**
* 每张图片对应的title
*/
private String[] titles=new String[]{
"第一次写图片轮播",
"第二次写图片轮播",
"第三次写图片轮播",
"第四次写图片轮播",
"第五次写图片轮播"
};
/**
* 存入每张图片的Id,分别是:a,b,c,d,e
*/
private int[] imageIds=new int[]{
R.drawable.a,
R.drawable.b,
R.drawable.c,
R.drawable.d,
R.drawable.e
};
/**
* ViewPager UI控件放入图片
*/
private ViewPager mViewPager;
private ViewPagerAdapter mAdapter;
/**
* 线程池定时执行图片切换
*/
private ScheduledExecutorService mScheduledExecutorService;
private TextView title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initView();//初始化View
/**
* 写下一个图片适配器
*/
mAdapter=new ViewPagerAdapter();
mViewPager.setAdapter(mAdapter);
/**
* 监听mViewPager的滑动效果,滑动状态
*/
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override
public void onPageSelected(int position) {
title.setText(titles[position]);
dots.get(position).setBackgroundResource(R.drawable.dot_focused);
dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);
currentItem=position;
oldPosition=position;
}

@Override
public void onPageScrolled(int position, float arg1, int arg2) {

}

boolean flag=false;
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
//手指滑动
case 1:
flag=false;
break;
//界面切换
case 2:
flag=true;
break;
//滑动结束
case 0:
//假设是最后一张,向右滑动时,切换到第一张
if(mViewPager.getCurrentItem()==mViewPager.getAdapter().getCount()-1 && !flag){
mViewPager.setCurrentItem(0);
}
//假设是第一张,向左滑动时,切换到最后一张
else if(mViewPager.getCurrentItem()==0 && !flag){
mViewPager.setCurrentItem(mViewPager.getAdapter().getCount()-1);
}
break;
default:
break;
}

}
});
}
private void initView() {
mViewPager=(ViewPager) findViewById(R.id.vp);
images=new ArrayList<ImageView>();
for(int i=0;i<imageIds.length;i++)
{
ImageView img=new ImageView(this);
img.setBackgroundResource(imageIds[i]);
images.add(img);
}
/**
* 放入图片下的点
*/
dots=new ArrayList<View>();
dots.add(findViewById(R.id.dot_0));
dots.add(findViewById(R.id.dot_1));
dots.add(findViewById(R.id.dot_2));
dots.add(findViewById(R.id.dot_3));
dots.add(findViewById(R.id.dot_4));
title=(TextView) findViewById(R.id.title);
title.setText(titles[0]);
}
/**
* 重写适配器
* 添加数据
* @author Eva-Beta
*
*/
private class ViewPagerAdapter extends PagerAdapter{

@Override
public int getCount() {
return images.size();
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public Object instantiateItem(ViewGroup view, int position) {
view.addView(images.get(position));
return images.get(position);
}
@Override
public void destroyItem(ViewGroup view, int position, Object object) {
view.removeView(images.get(position));
}
}
/**
* 实现run函数,运行图片轮播
* @author Eva-Beta
*
*/
private class ViewPagerTask implements Runnable{
@Override
public void run() {
currentItem=(currentItem+1)%imageIds.length;
mHandler.sendEmptyMessage(0);
}
}
/**
* 接收子线程传递过来的数据
*/
private Handler mHandler=new Handler(){
public void handleMessage(android.os.Message msg) {
mViewPager.setCurrentItem(currentItem);
};
};

@Override
protected void onStart() {
super.onStart();
mScheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
mScheduledExecutorService.scheduleWithFixedDelay(new ViewPagerTask(), 5, 5, TimeUnit.SECONDS);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
}
}


我的activity_main.xml:

<RelativeLayout 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" >

<FrameLayout
android:layout_width="match_parent"
android:layout_height="200dip" >

<android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="35dip"
android:layout_gravity="bottom"
android:background="#33000000"
android:gravity="center"
android:orientation="vertical" >

<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="图片标题"
android:textColor="@android:color/white" />

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dip"
android:orientation="horizontal" >

<View
android:id="@+id/dot_0"
android:layout_width="5dip"
android:layout_height="5dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:background="@drawable/dot_focused"/>

<View
android:id="@+id/dot_1"
android:layout_width="5dip"
android:layout_height="5dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:background="@drawable/dot_normal"/>
<View
android:id="@+id/dot_2"
android:layout_width="5dip"
android:layout_height="5dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:background="@drawable/dot_normal"/>
<View
android:id="@+id/dot_3"
android:layout_width="5dip"
android:layout_height="5dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:background="@drawable/dot_normal"/>
<View
android:id="@+id/dot_4"
android:layout_width="5dip"
android:layout_height="5dip"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:background="@drawable/dot_normal"/>

</LinearLayout>
</LinearLayout>
</FrameLayout>

</RelativeLayout>


轮播下面的点被按下:

dot.focused.xml :

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<corners android:radius="5dip"/>
<solid android:color="#55000000"/>
</shape>


轮播下面的点没有被按下:

dot.normal.xml :

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<corners android:radius="5dip"/>
<solid android:color="#aaFFFFFF"/>
</shape>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: