ViewPager

1、ViewPager

一个用于页面切换的控件,如多个ImageView,Fragment之间的切换。

2、简单应用

首先,来看一下效果图。
这里写图片描述

这里写图片描述

activitymain.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="com.example.admin.vip_14.MainActivity">

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

    </android.support.v4.view.ViewPager>

    <RadioGroup
        android:id="@+id/rg"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:orientation="horizontal"
        >

    </RadioGroup>


</LinearLayout>

RadioGroup就是下面的几个小点,可以跟随图片一起切换。

MainActivity.java

import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;
    private RadioGroup mRadioGroup;
    private List<ImageView> mList;

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

        mList = new ArrayList<>();

        ImageView imageView1 = new ImageView(MainActivity.this);
        imageView1.setImageResource(R.drawable.dragon2);
        ImageView imageView2 = new ImageView(MainActivity.this);
        imageView2.setImageResource(R.drawable.dragon2);
        ImageView imageView3 = new ImageView(MainActivity.this);
        imageView3.setImageResource(R.drawable.dragon2);
        ImageView imageView4 = new ImageView(MainActivity.this);
        imageView4.setImageResource(R.drawable.dragon2);

        mList.add(imageView1);
        mList.add(imageView2);
        mList.add(imageView3);
        mList.add(imageView4);

        initView();

        initDots();

        mViewPager.setAdapter(new ViewPagerAdapter(mList, MainActivity.this));

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(2000);
                        mHandler.sendEmptyMessage(0);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    private void initDots() {
        int wrap = RadioGroup.LayoutParams.WRAP_CONTENT;
        RadioGroup.LayoutParams layoutParams = new RadioGroup.LayoutParams(wrap, wrap);
        layoutParams.leftMargin = 15;
        for(int i = 0; i < mList.size(); i++) {
            RadioButton rb = new RadioButton(MainActivity.this);
            rb.setButtonDrawable(R.drawable.x_dot_selector);
            rb.setId(i);
            //如果不是第一个点,则每个点与前一个点相距15dp。
            if(i != 0) {
                mRadioGroup.addView(rb, layoutParams);
            }
            else {
                mRadioGroup.addView(rb);
            }
            mRadioGroup.check(0);
        }
    }

    private void initView() {
        mViewPager = findViewById(R.id.vp);
        mRadioGroup = findViewById(R.id.rg);
    }

    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            int position = mViewPager.getCurrentItem() + 1;
            mViewPager.setCurrentItem(position%4);
            mRadioGroup.check(position%4);
        }
    };
}

在MainActivity中主要进行控件的查找,数据的初始化,初始化布局。

ViewPagerAdapter.java

package com.example.admin.vip_14;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.List;

public class ViewPagerAdapter extends PagerAdapter{
    private List<ImageView> mImageViewList;

    public ViewPagerAdapter(List<ImageView> image, Context context) {
        this.mImageViewList = image;
        mContext = context;
    }

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

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(mImageViewList.get(position));
        return mImageViewList.get(position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(mImageViewList.get(position));
    }
}

在ViewPagerAdapter继承自PagerAdapter,需要重写四个方法。

  • getCount( ) : 返回滑动View的个数
  • isViewFromObject( ) : 通常直接写view == object。
  • instantiateItem( ) :将给定位置的view添加到ViewGroup(容器)中,创建并显示出来。
  • destroyItem( ) :移除一个给定位置的页面。

最后说一下,小点的形成。

x_dot_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--选中-->
    <item android:drawable="@drawable/dof_focus" android:state_checked="true" />
    <!--未选中-->
    <item android:drawable="@drawable/dof_unfocus" />
</selector>

dof_focus.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <!--描边-->
    <stroke
        android:width="1dp"
        android:color="#0000ff" />
    <solid android:color="#0e82bc" />
    <!--设置宽度和高度相同  让椭圆变成圆-->
    <size
        android:width="10dp"
        android:height="10dp" />
</shape>

dof_unfocus.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <!--描边-->
    <stroke
        android:width="1dp"
        android:color="#0000ff" />
    <!--填充色-->
    <solid android:color="#ffffff" />
    <!--设置宽度和高度相同  让椭圆变成圆-->
    <size
        android:width="10dp"
        android:height="10dp" />
</shape>

3、出现的问题

当使用的照片不一样时,则跳转到第二张照片,就会出错。
这里写图片描述
但是如果使用同一张照片就不会报错。

修改措施:
在Manifest文件中加入

android:largeHeap="true"

即可申请到最大的内存。

但是申请的内存也是根据/system/build.prop文件所对应的。

dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=192m
dalvik.vm.heapsize=512m
  • dalvik.vm.heapstartsize :该项用来设置堆内存的初始大小。
  • dalvik.vm.heapgrowthlimit :该项用来设置一个标准的应用的最大堆内存大小。一个标准的应用就是没有使用android:largeHeap的应用。
  • dalvik.vm.heapsize :该项设置了使用android:largeHeap的应用的最大堆内存大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值