是否觉得只有几个按钮和几个View有点太单一呢,页面上怎么能只显示这么少的内容呢?没关系,ViewPager来帮忙。(听说已经过时,但还是看一下吧,总是相通的)这里是参考了《第一行代码》一书。
先上代码。
MainActivity.java
package com.example.viewpagertry;
import android.app.Activity;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewPager pager=new ViewPager(this);
pager.setAdapter(new ImagePagerAdapter(this));
setContentView(pager);
}
}
ImagePagerAdapter.java
package com.example.viewpagertry;
import android.content.Context;
import android.graphics.Color;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
public class ImagePagerAdapter extends PagerAdapter {
private Context mcontext;
private static final int[] IMAGES={
android.R.drawable.ic_menu_camera,
android.R.drawable.ic_menu_add,
android.R.drawable.ic_menu_delete,
android.R.drawable.ic_menu_share,
android.R.drawable.ic_menu_edit
};
private static final int[] COLORS={
Color.RED,Color.BLUE,Color.GREEN,Color.GRAY,Color.MAGENTA
};
private static final String[] Content={
"aa","bb","cc","dd","ee"
};
public ImagePagerAdapter(Context context){
super();
mcontext=context;
}
@Override
public int getCount(){
return IMAGES.length;
}
@Override
public float getPageWidth(int position){
return 1f;
}
@Override
public Object instantiateItem(ViewGroup container,int position) {
ImageView imageView = new ImageView(mcontext);
imageView.setImageResource(IMAGES[position]);
imageView.setBackgroundColor(COLORS[position]);
TextView textView=new TextView(mcontext);
textView.setText(Content[position]);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container,int position,Object object){
container.removeView((View) object);
}
@Override
public boolean isViewFromObject(View view,Object object){
return (view==object);
}
}
刚入门的同学可能觉得Adapter这个东西有点虚无缥缈,其实就是一个适配器,用来告诉.xml什么位置该显示什么内容,扩展性强,太自由就是它的难点吧。如上的代码运行起来就是一个可以左右滑动的页面了,我这里吗只是设计了几张简单的图片和背景颜色,必须通过手动滑动来查看页面,如果想要更复杂的都可通过自定义来实现,继续向下看。这样翻页的效果如果再 配上一个Timer 和setCurrentiem就可以完成了一个轮播,就想淘宝和各种新闻客户端上的一样,循环显示信息。但是总感觉少了点什么,后来一番思考,又做了个小圆点,随着滑动,来变化。想法比较粗糙,可能效率也不太高,以后想到了再来更新。
附完整代码。
更改后的完整的activity如下。adapter还是上面的那个,没有进行更改。
package com.example.viewpagertry;
import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
private Handler handler;
private Thread thread;
private ViewPager viewPager;
private LinearLayout ll_dot;
private Context context;
private int s=0;
List<ImageView> dots = new ArrayList<ImageView>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context=this;
viewPager=(ViewPager)findViewById(R.id.viewpager);
ImagePagerAdapter adapter=new ImagePagerAdapter(context);
ll_dot = (LinearLayout) findViewById(R.id.ll_dot);
viewPager.setAdapter(adapter);
initdot(s);
thread=new Thread(){
public void run(){
while (true){
try {
Thread.sleep(3000); //等待轮播 3秒
} catch (InterruptedException e) {
e.printStackTrace();
}
Message.obtain(handler,0,"").sendToTarget();
}
}
};
thread.start();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
int i=viewPager.getCurrentItem();
if (i==4){
viewPager.setCurrentItem(0);
initdot(0);
}else{
i++;
viewPager.setCurrentItem(i);
initdot(i);
}
break;
default:
break;
}
}
};
}
private void initdot(int k) {
ll_dot.removeAllViews();
for (int i = 0; i <5; i++) {
ImageView img = new ImageView(this);
if (i == k) {
img.setImageResource(R.drawable.point_checked);
} else {
img.setImageResource(R.drawable.point_normal);
}
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(50, 50);
params.setMargins(5, 0, 5, 5);
// 加载到布局容器
ll_dot.addView(img, params);
dots.add(img);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
thread.stop();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
thread.start();
break;
}
return super.onTouchEvent(ev);
}
}
里面用的两个drawable
point_checked
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="8dp" />
<solid android:color="#fff" >
</solid>
</shape>
point_normal
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="8dp" />
<solid android:color="#fff" >
</solid>
</shape>
中间的Activity我重写了一个触摸事件,就是要在手动更改Viewpager的时候,让负责轮播的线程停下来,否则还会继续轮播,达不到想要的效果。绘图是一项很重要的技能,发现自己很薄弱,还需改正。