【Android】利用ViewPager控件实现软件启动引导页

1.自定义ViewPageItemView的布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="picture"
        android:scaleType="fitXY"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:layout_marginBottom="30dp"
        android:text="title"
        android:textColor="@color/black"
        android:textSize="18sp" />

</FrameLayout>

2.自定义ViewPageItemView用于显示相册中一个图片及其图片备注

/**
 * 
 */
package com.example.learn.overall.view;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.learn.R;

/**
 * Description: 相册中的一帧
 * 
 * @author danDingCongRong
 * @Version 1.0.0
 * @Created at 2014-6-25 21:10:55
 * @Modified by [作者] on [修改日期]
 */
public class ViewPageItemView extends FrameLayout {

	/** 图片的ImageView */
	private ImageView imageView;
	/** 图片的名称 */
	private TextView tvTitle;

	/** 图片的Bitmap */
	private Bitmap bitmap;

	/** 要显示图片的JsonObject */
	private JSONObject jsonObject;

	public ViewPageItemView(Context context) {
		super(context);

		initView(context);
	}

	public ViewPageItemView(Context context, AttributeSet attrs) {
		super(context, attrs);

		initView(context);
	}

	public ViewPageItemView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		initView(context);
	}

	// 初始控件
	private void initView(Context context) {
		View view = LayoutInflater.from(context).inflate(
				R.layout.viewpage_itemview, null);

		imageView = (ImageView) view.findViewById(R.id.imageView);
		tvTitle = (TextView) view.findViewById(R.id.tvTitle);

		addView(view);
	}

	// 填充数据
	public void setData(JSONObject jsonObject) {
		this.jsonObject = jsonObject;

		try {
			int resourceId = jsonObject.getInt("resourceId");
			String title = jsonObject.optString("title");

			imageView.setImageResource(resourceId);
			tvTitle.setText(title);
		} catch (JSONException e) {
			e.printStackTrace();
		}

	}

	// 资源回收
	public void recycle() {
		imageView.setImageBitmap(null);

		if (null == bitmap || bitmap.isRecycled()) {
			return;
		}

		bitmap.recycle();
		bitmap = null;
	}

	// 重新加载资源
	public void reload() {
		try {
			int resourceId = jsonObject.getInt("resourceId");
			imageView.setImageResource(resourceId);
		} catch (JSONException e) {
			e.printStackTrace();
		}
	}

}

3.基于PageAdapter的相册适配器

/**
 * 
 */
package com.example.learn.overall.adapter;

import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;

import com.example.learn.overall.view.ViewPageItemView;

/**
 * Description: 相册的适配器
 * 
 * @author danDingCongRong
 * @Version 1.0.0
 * @Created at 2014-6-25 21:35:53
 * @Modified by [作者] on [修改日期]
 */
public class ViewPageAdapter extends PagerAdapter {

	private Context context;

	private JSONArray jsonArray;

	private Map<Integer, ViewPageItemView> hashMap;

	public ViewPageAdapter(Context context, JSONArray jsonArray) {
		this.context = context;
		this.jsonArray = jsonArray;
		this.hashMap = new HashMap<Integer, ViewPageItemView>();
	}

	// 返回资源数目
	@Override
	public int getCount() {
		return jsonArray.length();
	}

	// 初始化要显示的资源
	@Override
	public Object instantiateItem(View container, int position) {
		ViewPageItemView itemView;
		if (hashMap.containsKey(position)) {
			itemView = hashMap.get(position);
			itemView.reload();
		} else {
			itemView = new ViewPageItemView(context);
			try {
				JSONObject jsonObject = jsonArray.getJSONObject(position);
				itemView.setData(jsonObject);
			} catch (JSONException e) {
				e.printStackTrace();
			}

			hashMap.put(position, itemView);
			((ViewPager) container).addView(itemView);
		}

		return itemView;
	}

	// 进行资源回收
	@Override
	public void destroyItem(View container, int position, Object object) {
		ViewPageItemView itemView = (ViewPageItemView) object;
		itemView.recycle();
	}

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

	@Override
	public void restoreState(Parcelable parcelable, ClassLoader classLoader) {
		;
	}

	@Override
	public Parcelable saveState() {
		return null;
	}

	@Override
	public void startUpdate(View view) {
		;
	}

	@Override
	public void finishUpdate(View view) {
		;
	}

}

4.activity_test_viewpage.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

        <!-- ViewPager是一个控件 -->

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

</LinearLayout>

5.测试用的Activity

package com.example.learn.activity;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.Window;

import com.example.learn.R;
import com.example.learn.overall.adapter.ViewPageAdapter;

public class TestViewPageActivity extends Activity {

	private static final int PICTURE_COUNT = 4;

	private static final int[] PICTURE_RESOURCES = { R.drawable.guide_page1,
			R.drawable.guide_page2, R.drawable.guide_page3,
			R.drawable.guide_page4, };
	
	private static final String[] PICTURE_TITLE = { "第一张图片", "第二张图片", "第三张图片",
			"此软件已经烂的不能再烂了,祝你失败", };

	private JSONArray jsonArray;

	private ViewPager viewPager;
	private ViewPageAdapter adapter;

	private Context context = TestViewPageActivity.this;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_test_viewpage);

		initLoadData();
		initView();
	}

	private void initLoadData() {
		jsonArray = new JSONArray();

		for (int i = 0; i < PICTURE_COUNT; i++) {
			JSONObject jsonObject = new JSONObject();
			try {
				jsonObject.put("resourceId", PICTURE_RESOURCES[i]);
				jsonObject.put("title", PICTURE_TITLE[i]);
			} catch (JSONException e) {
				e.printStackTrace();
			}

			jsonArray.put(jsonObject);
		}
	}

	private void initView() {
		viewPager = (ViewPager) findViewById(R.id.viewpage);
		adapter = new ViewPageAdapter(context, jsonArray);
		viewPager.setAdapter(adapter);
	}

}

6.效果图


Demo资源下载http://download.csdn.net/detail/u010119170/7695169


参考:Android高手进阶教程(二十八)之---Android ViewPager控件的使用(基于ViewPager的横向相册)!!!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1. 创建一个新的Activity作为引导,例如GuideActivity。 2. 在GuideActivity的布局文件中添加一个ViewPager2控件。 3. 创建一个适配器类,继承自ViewPager2.Adapter,并实现三个方法:getItemCount()、createViewHolder()和bindViewHolder()。 4. 在getItemCount()方法中返回引导的数量。 5. 在createViewHolder()方法中创建一个View,将其包装在一个ViewHolder中并返回。 6. 在bindViewHolder()方法中设置每一的内容。 7. 在GuideActivity中,将ViewPager2控件与适配器关联,并设置面切换动画。 8. 最后,在GuideActivity中添加一个按钮,用于跳过引导并进入主界面。 以下是示例代码: 1. GuideActivity布局文件: ``` <androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 引导适配器类: ``` public class GuideAdapter extends ViewPager2.Adapter<GuideAdapter.ViewHolder> { private List<Integer> images; public GuideAdapter(List<Integer> images) { this.images = images; } @Override public int getItemCount() { return images.size(); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_guide, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.imageView.setImageResource(images.get(position)); } static class ViewHolder extends RecyclerView.ViewHolder { ImageView imageView; public ViewHolder(@NonNull View itemView) { super(itemView); imageView = itemView.findViewById(R.id.image); } } } ``` 3. 在GuideActivity中使用适配器: ``` public class GuideActivity extends AppCompatActivity { private ViewPager2 viewPager; private GuideAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_guide); viewPager = findViewById(R.id.viewPager); adapter = new GuideAdapter(Arrays.asList(R.drawable.guide_1, R.drawable.guide_2, R.drawable.guide_3)); viewPager.setAdapter(adapter); viewPager.setPageTransformer(new ZoomOutPageTransformer()); // 设置面切换动画 Button skipButton = findViewById(R.id.skip_button); skipButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(GuideActivity.this, MainActivity.class)); // 跳过引导 finish(); } }); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值