Android之ViewPager的使用

         我们知道现在很多app都有左右滑动的效果,那在安卓里是怎么实现的呢?这里就是用到我们所说的ViewPager,它是一个控件,但不是一个原生的控件(如Button控件等之类的),它是android3.0以上才能使用的,位于android.support.v4.jar包下,接下来为了让大家更加熟悉的了解ViewPager的使用,我们通过一个例子来介绍:

         这个demo很简单:只用到了一个布局文件activity_main以及一个Activity,当viewPager显示某页时,该页的点为红色,默认是白色,同时每隔4S钟自动跳转到下一页

    一、首先提供一下demo用到的布局文件

    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="300dip">

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


        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="90dip"
            android:layout_alignParentBottom="true"
            android:background="#aa000000"
            android:gravity="center"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_description"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="美丽的风景,我的家!"
                android:textColor="@android:color/white"/>

            <LinearLayout
                android:layout_marginTop="20dp"
                android:id="@+id/ll_points"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center">

            </LinearLayout>
        </LinearLayout>

    </RelativeLayout>

</RelativeLayout>

   二、MainActicity类文件如下:

package com.example.administrator.viewpager;


import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;


import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;


public class MainActivity extends Activity implements ViewPager.OnPageChangeListener {


private static final String TAG = "MainActivity";
private ViewPager viewPager;
private MyViewPageAdapter myViewPageAdapter;
private List<ImageView> imageViewList;
private TextView description;
private LinearLayout points;
private Handler handler;
private int currentPage = 0; //当前页


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


initView();
prepareData();
operate();
}

/**
* 数据操作
*/
private void operate() {
myViewPageAdapter = new MyViewPageAdapter();
viewPager.setAdapter(myViewPageAdapter);
viewPager.setCurrentItem(0);
viewPager.setOnPageChangeListener(this);

points.getChildAt(0).setEnabled(true);
}

/**
* 准备数据
*/
private void prepareData() {
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);

if(currentPage<imageViewList.size()){
viewPager.setCurrentItem(currentPage);
}else if(currentPage>=imageViewList.size()){
currentPage=0;
viewPager.setCurrentItem(currentPage);
}
currentPage++;
}
};
imageViewList = new ArrayList<ImageView>();
int[] images = getImages();
for (int i=0;i<images.length;i++){

// //内存溢出
// ImageView imageView = new ImageView(this);
// imageView.setBackgroundResource(images[i]);

// //内存溢出
// Drawable drawable = getResources().getDrawable(images[i]);
// imageView.setBackgroundDrawable(drawable);

// //正常情况
// ImageView imageView = new ImageView(this);
// InputStream is = this.getResources().openRawResource(images[i]);
// BitmapFactory.Options options=new BitmapFactory.Options();
// options.inJustDecodeBounds = false;
// options.inSampleSize = 10;   //width,hight设为原来的十分一
// Bitmap bmp =BitmapFactory.decodeStream(is,null,options);
// imageView.setBackgroundDrawable(new BitmapDrawable(bmp));

ImageView imageView = new ImageView(this);
InputStream is = this.getResources().openRawResource(images[i]);
Bitmap bmp =BitmapFactory.decodeStream(is,null,null);
imageView.setBackgroundDrawable(new BitmapDrawable(bmp));

imageViewList.add(imageView);

//添加点
ImageView imageView2 = new ImageView(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams

(10,10);
lp.leftMargin = 20;
imageView2.setLayoutParams(lp);
imageView2.setBackgroundResource(R.drawable.point_select);
imageView2.setEnabled(false);
points.addView(imageView2);
}
}
/**
* 初始化
*/
private void initView() {
viewPager = (ViewPager) findViewById(R.id.viewpager);
description = (TextView) findViewById(R.id.tv_description);
points = (LinearLayout) findViewById(R.id.ll_points);
}

/**
* 获取图片
* @return
*/
private int[] getImages(){
return new int[]{
R.drawable.image1,
R.drawable.image2,
R.drawable.image3,
R.drawable.image4,
R.drawable.image5,
R.drawable.image6,
// R.drawable.theme1,
// R.drawable.theme2,
// R.drawable.theme3,
// R.drawable.theme4,
// R.drawable.theme5,
// R.drawable.theme6,
};
}

/**
* 获取字符描述
* @return
*/
private String[] getDescription() {
return new String[]{
"美丽的风景,我的家!",
"那边的花儿真美丽!",
"夕阳与大地融为一体",
"好刺眼...",
"人间仙境",
"顽强的生命力",
};
}


@Override
protected void onResume() {
super.onResume();


Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(0);
}
}, 2000, 4000);
}


@Override
protected void onDestroy() {
super.onDestroy();
}

@Override
public void onPageScrolled(int position, float positionOffset, int 
positionOffsetPixels) {
Log.i(TAG,"onPageScrolled...");

}

@Override
public void onPageSelected(int position) {
Log.i(TAG, "onPageSelected..."+position);
currentPage = position;
String[] description = getDescription();
this.description.setText(description[position]);


int childCount = points.getChildCount();
for(int i=0;i<childCount;i++){
points.getChildAt(i).setEnabled(false);
}
points.getChildAt(position).setEnabled(true);
}
@Override
public void onPageScrollStateChanged(int state) {
Log.i(TAG, "onPageScrollStateChanged..."+state);
}

private class MyViewPageAdapter extends PagerAdapter {

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

@Override
public boolean isViewFromObject(View view, Object o) {
return view==o;
}


@Override
public Object instantiateItem(ViewGroup container, int position) {
((ViewPager)container).addView(imageViewList.get(position));
return imageViewList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager)container).removeView(imageViewList.get(position));
}

三、技术点

       1.setBackgroundResource与setBackgroundDrawable的区别

         当用setBackgroundResource设置一个view控件的大背景时,此时会出现内存溢出,详情请看代码中的描述使用。我们在设置大背景时尽量不要setBackgroundResource、setBackgroundDrawable及setImageBitmap,因为它们三个都是在java层调用createBitmap,这个方法将会消耗更大的内存,所以我们尽量避免使用。在这里我们使用BimapFactory.decodeStream方法,它是直接使用于native层,可以避免java层的内存消耗


       2.PagerAdapter子类需复写的方法

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

@Override
public boolean isViewFromObject(View view, Object o) {
return view==o;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {


((ViewPager)container).addView(imageViewList.get(position));
return imageViewList.get(position);
      }

@Override
public void destroyItem(ViewGroup container, int position, Object object) {


((ViewPager)container).removeView(imageViewList.get(position));
}


      3.shape的使用

      shape是android中用于设定形状,它有六个属性,分别为corners(用于设置圆角)、gradient(用于设置渐变)、padding(用于设置间隔)、size(用于设置大小)、solid(用于设置填充)、stroke(用于设置描边),当然这块很简单,就不作详细描述了


四、总结

        上述内容如有讲的不好的地方,请批评指正,谢谢




   

猜你喜欢

转载自blog.csdn.net/wufeiqing/article/details/50364099