Android使用ViewPager实现类似laucher左右拖动效果

作者:cjjky 时间:2022-05-18 20:33:59 

现在很多Android应用在首次安装完都会有指引如何使用该应用的某些功能的指引界面,这样会获得很好的用户体验,能够帮助用户更好使用应用的某些功能。其实该功能和Android主界面的 luncher 的功能完全一样的效果,可以实现左右拖动。

下面结合 ViewPager 的实例来展示如何实现该功能,先看下该Demo的结构图:

Android使用ViewPager实现类似laucher左右拖动效果

注:ViewPager类是实现左右两个屏幕平滑地切换的一个类,是由Google 提供的, 使用ViewPager首先需要引入android-support-v4.jar这个jar包。其中工程项目中的 libs 文件夹下存放着 android-support-v4.jar这个jar包。drawable文件夹下包含有图片资源文件。

以下是工程中各个文件的源码:

main.xml源码:


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

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

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/viewGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
android:gravity="center_horizontal"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>

</FrameLayout>

item01.xml源码:


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

<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/feature_guide_0" >
</ImageView>

</LinearLayout>

其中item02.xml,item03.xml,item04.xml布局文件的源码和item01.xml布局文件一样,只是 ImageView 中的 android:background 属性的背景图片不同而已。

GuideViewDemoActivity.java 源码:


package com.andyidea.guidedemo;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.ImageView;

public class GuideViewDemoActivity extends Activity {

private ViewPager viewPager;
private ArrayList<View> pageViews;
private ViewGroup main, group;
private ImageView imageView;
private ImageView[] imageViews;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);

LayoutInflater inflater = getLayoutInflater();
pageViews = new ArrayList<View>();
pageViews.add(inflater.inflate(R.layout.item01, null));
pageViews.add(inflater.inflate(R.layout.item02, null));
pageViews.add(inflater.inflate(R.layout.item03, null));
pageViews.add(inflater.inflate(R.layout.item04, null));

imageViews = new ImageView[pageViews.size()];
main = (ViewGroup)inflater.inflate(R.layout.main, null);

// group是R.layou.main中的负责包裹小圆点的LinearLayout.
group = (ViewGroup)main.findViewById(R.id.viewGroup);

viewPager = (ViewPager)main.findViewById(R.id.guidePages);

for (int i = 0; i < pageViews.size(); i++) {
 imageView = new ImageView(GuideViewDemoActivity.this);
 imageView.setLayoutParams(new LayoutParams(20,20));
 imageView.setPadding(20, 0, 20, 0);
 imageViews[i] = imageView;
 if (i == 0) {
 //默认选中第一张图片
 imageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);
 } else {
 imageViews[i].setBackgroundResource(R.drawable.page_indicator);
 }
 group.addView(imageViews[i]);
}

setContentView(main);

viewPager.setAdapter(new GuidePageAdapter());
viewPager.setOnPageChangeListener(new GuidePageChangeListener());
}

/** 指引页面Adapter */
class GuidePageAdapter extends PagerAdapter {

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

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
 return arg0 == arg1;
}

@Override
public int getItemPosition(Object object) {
 // TODO Auto-generated method stub
 return super.getItemPosition(object);
}

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
 // TODO Auto-generated method stub
 ((ViewPager) arg0).removeView(pageViews.get(arg1));
}

@Override
public Object instantiateItem(View arg0, int arg1) {
 // TODO Auto-generated method stub
 ((ViewPager) arg0).addView(pageViews.get(arg1));
 return pageViews.get(arg1);
}

@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
 // TODO Auto-generated method stub

}

@Override
public Parcelable saveState() {
 // TODO Auto-generated method stub
 return null;
}

@Override
public void startUpdate(View arg0) {
 // TODO Auto-generated method stub

}

@Override
public void finishUpdate(View arg0) {
 // TODO Auto-generated method stub

}
}

/** 指引页面改 * */
class GuidePageChangeListener implements OnPageChangeListener {

@Override
public void onPageScrollStateChanged(int arg0) {
 // TODO Auto-generated method stub

}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
 // TODO Auto-generated method stub

}

@Override
public void onPageSelected(int arg0) {
 for (int i = 0; i < imageViews.length; i++) {
 imageViews[arg0]
  .setBackgroundResource(R.drawable.page_indicator_focused);
 if (arg0 != i) {
  imageViews[i]
   .setBackgroundResource(R.drawable.page_indicator);
 }
 }

}

}

}

运行上面的程序,效果截图如下: 

Android使用ViewPager实现类似laucher左右拖动效果 Android使用ViewPager实现类似laucher左右拖动效果 Android使用ViewPager实现类似laucher左右拖动效果 Android使用ViewPager实现类似laucher左右拖动效果

至此大功告成,已经采用ViewPager组件实现了左右滑动(拖动)效果。

源码下载:Android实现类似laucher左右拖动

来源:https://blog.csdn.net/cjjky/article/details/7417242

标签:Android,ViewPager,拖动
0
投稿

猜你喜欢

  • C#利用控件拖拽技术制作拼图游戏

    2023-05-24 21:27:34
  • 常用的Java数据结构知识点汇总

    2022-09-09 02:26:02
  • Java的字符串中对子字符串的查找方法总结

    2022-12-16 17:16:31
  • Java实现导入导出Excel文件的方法(poi,jxl)

    2021-09-13 21:12:35
  • 详解Spring Boot 事务的使用

    2022-08-09 01:59:07
  • C#实现终止正在执行的线程

    2022-05-06 22:34:22
  • Java 十大排序算法之插入排序刨析

    2021-12-07 02:48:54
  • Android6.0开发中屏幕旋转原理与流程分析

    2023-06-22 19:21:23
  • Java面试题冲刺第二十三天--分布式

    2023-09-24 07:30:43
  • 时间处理函数工具分享(时间戳计算)

    2021-07-24 05:06:18
  • C#常用GDI+文字操作汇总

    2022-10-24 00:51:12
  • 详解Spring Boot中使用AOP统一处理Web请求日志

    2021-08-24 15:50:17
  • C#生成PDF文件流

    2023-03-19 08:52:56
  • 利用java开发简易版扫雷游戏

    2023-11-07 14:35:15
  • apache ant进行zip解压缩操作示例分享

    2021-11-08 09:16:03
  • 初识Java环境变量配置及IDEA

    2022-09-20 06:46:41
  • 用Java设计模式中的观察者模式开发微信公众号的例子

    2023-01-17 05:30:58
  • C# WPF后台动态添加控件实战教程

    2022-07-29 18:52:51
  • C#实现实体类和XML相互转换

    2023-06-16 04:37:32
  • Java Date时间类型的操作实现

    2023-11-25 06:44:31
  • asp之家 软件编程 m.aspxhome.com