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的应用的最大堆内存大小。