`
1320438999
  • 浏览: 130074 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android之ViewPager显示应用新特性

 
阅读更多

我们都知道,很多应用在安装后第一次使用都会有一个新特性显示,一个好的新特性显示,将给客户带来更好的体验,因此,当我们做一个应用的时候,不能忽视这个问题,不得不佩服微信在这方面做得很不错。今天我就来模仿微信新特性的显示,做一个小应用。

源码下载地址:http://download.csdn.net/detail/weidi1989/4562605

废话不多说,先上效果图:

最后一张,增加了一个开门的动画效果:

下面是主要的类结构:

下面开始贴代码:

LoginActivity代码:
package com.way.viewpager;

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

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Animation.AnimationListener;
import android.view.Window;
import android.widget.ImageView;

/**
 * 
 * @author way
 * 
 */
public class LoginActivity extends Activity {
	private static final int ISNEW = 0x001;// 是否为
	private static final int COMPLETE = 0x002;// 新特性显示完毕
	private Context mContext = this;
	private DotMarks mDotMarks;
	private ImageView ivLeftImage,ivRightImage;
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case ISNEW:
				// if (WhatIsNewUtils.isFirstUse(LoginActivity.this))
				// {//如果是第一次使用该应用
				init();
				// 保存标记,下一次打开程序WhatIsNewUtils.isFirstUse(LoginActivity.this)返回的是false
				WhatIsNewUtils.saveFirstUseFlag(LoginActivity.this);
				// }else{
				// setContentView(R.layout.activity_main);
				// }

				break;
			case COMPLETE:
				View mainView = LayoutInflater.from(mContext).inflate(R.layout.activity_main, null);
				setContentView(mainView);
				Animation enterAnim = AnimationUtils.loadAnimation(mContext, R.anim.main_activity_enter_anim);
				enterAnim.setFillAfter(true);
				mainView.startAnimation(enterAnim);
				break;
			default:
				break;
			}
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.login);
		new Timer().schedule(new TimerTask() {

			@Override
			public void run() {
				Message msg = Message.obtain();
				msg.what = ISNEW;
				handler.sendMessage(msg);
			}
		}, 2000);
	}

	/**
	 * 初始化新特性界面
	 */
	private void init() {
		LayoutInflater layoutInflater = LayoutInflater.from(mContext);
		View what_is_new = layoutInflater.inflate(R.layout.what_is_new, null);

		View pageOne = layoutInflater.inflate(R.layout.layout1, null);
		View pageTwo = layoutInflater.inflate(R.layout.layout2, null);
		View pageThree = layoutInflater.inflate(R.layout.layout3, null);
		ivLeftImage = (ImageView)pageThree.findViewById(R.id.iv_left_image01);
		ivRightImage = (ImageView)pageThree.findViewById(R.id.iv_left_image02);
		
		ViewPager viewPager = (ViewPager) what_is_new
				.findViewById(R.id.view_pager);
		List<View> viewItems = new ArrayList<View>();
		viewItems.add(pageOne);
		viewItems.add(pageTwo);
		viewItems.add(pageThree);
		viewPager.setAdapter(new WhatIsNewAdapter(viewItems));
		mDotMarks = (DotMarks) what_is_new.findViewById(R.id.dot_marks);
		/**
		 * 翻页监听事件,用于更新索引小图片
		 */
		viewPager.setOnPageChangeListener(new OnPageChangeListener() {
			/**
			 * 根据ViewPager的页面的变化来实时更新索引小图标
			 * */
			public void onPageSelected(int arg0) {
				mDotMarks.updateMark(arg0);// 更新
			}

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

			public void onPageScrollStateChanged(int arg0) {
				// TODO Auto-generated method stub
			}
		});
		/**
		 * 最后一个View添加点击事件,用于切换视图
		 */
		pageThree.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				mDotMarks.setVisibility(View.INVISIBLE);	startAnimation();//开始动画
			}
		});
		this.setContentView(what_is_new);
	}
	/**
	 * 动画
	 */
	private void startAnimation(){
		Animation leftAnim = AnimationUtils.loadAnimation(mContext, R.anim.slide_left_anim);
		Animation rightAnim = AnimationUtils.loadAnimation(mContext, R.anim.slide_right_anim);
//		final Animation fadeAnim = AnimationUtils.loadAnimation(mContext, R.anim.fade_anim);
		leftAnim.setFillAfter(true);
		rightAnim.setFillAfter(true);
		rightAnim.setAnimationListener(new AnimationListener() {
			
			public void onAnimationStart(Animation animation) {
//					mDotMarks.startAnimation(fadeAnim);
			}
			
			public void onAnimationRepeat(Animation animation) {
				
			}
			
			public void onAnimationEnd(Animation animation) {//动画结束
				Message msg = handler.obtainMessage();
				msg.what = COMPLETE;
				handler.sendMessage(msg);
			}
		});
		ivLeftImage.startAnimation(leftAnim);
		ivRightImage.startAnimation(rightAnim);
	}
}

自定义DotMarks,就是下面三个小圆点,模拟翻页效果:
package com.way.viewpager;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
/**
 * 
 * @author way
 *
 */
public class DotMarks extends LinearLayout {
	private ImageView mark_one, mark_two, mark_three;//三个小点图片
	private Drawable guide_focus = getResources().getDrawable(
			R.drawable.guide_focus);//焦点图片资源
	private Drawable guide_default = getResources().getDrawable(
			R.drawable.guide_default);//非焦点图片资源

	public DotMarks(Context context) {
		super(context);
		init(context);
	}

	public DotMarks(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}
	/**
	 * 初始化
	 * @param context
	 * 上下文对象
	 */
	private void init(Context context) {
		LayoutInflater layoutInflater = LayoutInflater.from(context);
		View dotmarks = layoutInflater.inflate(R.layout.dot_marks, null);
		this.addView(dotmarks);
		mark_one = (ImageView) dotmarks.findViewById(R.id.dot_mark1);
		mark_two = (ImageView) dotmarks.findViewById(R.id.dot_mark2);
		mark_three = (ImageView) dotmarks.findViewById(R.id.dot_mark3);
		
		//设置一个默认值
		mark_one.setImageResource(R.drawable.guide_focus);
		mark_two.setImageResource(R.drawable.guide_default);
		mark_three.setImageResource(R.drawable.guide_default);
	}

	/**
	 * 
	 * 根据传递进来的页面的索引切换小图标的显示
	 * 
	 * */
	public void updateMark(int index) {
		switch (index) {
		case 0:
			mark_one.setImageDrawable(guide_focus);
			mark_two.setImageDrawable(guide_default);
			mark_three.setImageDrawable(guide_default);
			break;
		case 1:
			mark_one.setImageDrawable(guide_default);
			mark_two.setImageDrawable(guide_focus);
			mark_three.setImageDrawable(guide_default);
			break;
		case 2:
			mark_one.setImageDrawable(guide_default);
			mark_two.setImageDrawable(guide_default);
			mark_three.setImageDrawable(guide_focus);
			break;

		default:
			break;
		}
	}

}

新特性适配器WhatIsNewAdapter:
package com.way.viewpager;

import java.util.List;

import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
/**
 * 
 * @author way
 *
 */
public class WhatIsNewAdapter extends PagerAdapter {
	public List<View> mListViews;

	public WhatIsNewAdapter(List<View> mListViews) {
		this.mListViews = mListViews;
	}

	@Override
	public void destroyItem(View arg0, int arg1, Object arg2) {
		((ViewPager) arg0).removeView(mListViews.get(arg1));
	}

	@Override
	public void finishUpdate(View arg0) {
	}

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

	@Override
	public Object instantiateItem(View arg0, int arg1) {
		((ViewPager) arg0).addView(mListViews.get(arg1), 0);
		return mListViews.get(arg1);
	}

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

	@Override
	public void restoreState(Parcelable arg0, ClassLoader arg1) {
	}

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

	@Override
	public void startUpdate(View arg0) {
	}

}

工具类WhatIsNewUtils,用来判断用户是否第一次使用该app:
package com.way.viewpager;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;

/**
 * 
 * @author way
 * */
public class WhatIsNewUtils 
{

	private static String WHAT_IS_NEW_PRE_NAME = "what_is_new_pre_name";
	
	private static String FIRST_USE_FLAG = "first_use_flag";
	 /**
	  * 
      * 判断是否是第一次使用该应用程序
      * 
      * */
    public static boolean isFirstUse(Context context)
    {
    	SharedPreferences sharedPreferences = context.getSharedPreferences(WHAT_IS_NEW_PRE_NAME, Activity.MODE_PRIVATE);
        boolean flag = sharedPreferences.getBoolean(FIRST_USE_FLAG, true);
        return flag;
    }
    
    /**
     * 
     *保存第一次使用的信息
     * 
     * */
    public static void saveFirstUseFlag(Context context)
    {
    	SharedPreferences sharedPreferences = context.getSharedPreferences(WHAT_IS_NEW_PRE_NAME, Activity.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean(FIRST_USE_FLAG, false);
        editor.commit();
    }
    
}

新特性的主布局文件what_is_new.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

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

    <com.way.viewpager.DotMarks
        android:id="@+id/dot_marks"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:paddingBottom="50dp" />

</RelativeLayout>
三个小圆点的布局文件dot_marks.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="horizontal" >


    <ImageView
        android:id="@+id/dot_mark1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/guide_default" />



    <ImageView
        android:id="@+id/dot_mark2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/guide_default" />


    <ImageView
        android:id="@+id/dot_mark3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/guide_default" />

</LinearLayout>
还有其他一些动画效果跟布局的文件,我就不贴出来了。


分享到:
评论

相关推荐

    IOS实现类似Android的ViewPager

    这篇内容将详细介绍如何在iOS应用中创建一个简易的ViewPager,以达到与Android平台上ViewPager相似的用户体验。 首先,我们需要理解Android的ViewPager是如何工作的。在Android中,ViewPager是一个可以展示多个页面...

    android之viewPager的简单使用

    这样,我们就可以实现一个基本的ViewPager应用,它能够展示多个页面,并可选地显示带有标题的TabLayout。当然,ViewPager还有许多高级用法,比如使用`FragmentStatePagerAdapter`优化内存管理、自定义滑动动画、设置...

    android ViewPager应用demo

    **Android ViewPager 应用详解** ViewPager 是 Android 平台上一个强大的视图组件,它允许用户通过左右滑动来浏览多个页面,通常用于实现平滑的水平滚动效果。在本示例中,我们将会探讨如何利用 ViewPager 实现三种...

    Android仿ViewPager(重写HorizontalScrollView)

    在Android开发中,ViewPager是一个非常常用的组件,它用于展示多个页面并允许用户通过左右滑动来切换页面。然而,有时我们需要实现一些自定义的功能,这时就需要对基础组件进行扩展或重写。本教程将深入探讨如何重写...

    android的ViewPager和Animation的一些使用

    这篇博客"android的ViewPager和Animation的一些使用"详细介绍了如何在应用中有效地结合这两个组件,以提升用户体验。 首先,`ViewPager`是Android SDK中的一个视图容器,它允许用户通过水平滑动来浏览多个页面。`...

    android ViewPager实现引导页效果

    在Android应用开发中,引导页(也称为欢迎页或新手引导)是一种常见的设计模式,用于初次启动应用时向用户介绍其主要功能和界面操作。在本教程中,我们将深入探讨如何利用ViewPager组件来实现这样的效果。ViewPager...

    android之ViewPager的使用

    【Android之ViewPager的使用】 ViewPager是Android SDK中的一个强大组件,它主要用于在多个视图之间进行滑动切换,常用于实现应用内的水平滚动页面效果,如应用的Tab切换或者图片轮播等。ViewPager通过适配器...

    androidx viewpager 源码把EFAULT_OFFSCREEN_PAGES 改为0

    在Android开发中,...总的来说,修改ViewPager的预加载策略是一项技术性的决策,需要权衡性能、用户体验和应用特性的需求。在某些情况下,这样的调整可能会带来显著的优化,但在其他情况下,可能需要谨慎处理。

    Android ViewPager用法解析

    **Android ViewPager详解** ...总的来说,Android的ViewPager是一个强大且灵活的组件,它能帮助开发者构建出具有优秀滑动体验的应用界面。理解其基本用法和高级特性,将有助于创建更加丰富多样的UI交互。

    Android ViewPager使用详解

    ViewPager是Android开发中一个非常重要的组件,它允许用户通过左右滑动来切换不同的页面,常用于实现应用的滑动导航或展示多个相似内容的页面。在本篇文章中,我们将深入探讨ViewPager的工作原理、基本用法以及一些...

    android-viewpager2,ViewPager2示例.zip

    本文将深入探讨ViewPager2,包括它的特性、用法以及如何在实际项目中集成和应用。 **1. ViewPager2的引入** ViewPager2是Android Jetpack库的一部分,旨在提供更高效、更易用的页面滑动体验。与之前的ViewPager...

    android viewpager android-support-v4.jar

    ViewPager是Android SDK中用于实现页面滑动效果的控件,常见于应用的导航栏或者展示多个横向可滑动内容的场景。Android Support Library v4则是一个重要的库,它提供了对早期Android版本的支持,让开发者可以使用...

    Android自定义ViewPager指示器PagerIndicator

    在Android开发中,ViewPager是一种常用的组件,用于展示多个页面并允许用户通过滑动来切换页面。而PagerIndicator则是配合ViewPager使用的视图元素,通常显示为小圆点或线条,用以指示当前显示的页面和总页面数。在...

    Android ViewPager左右滑动翻页含导航

    在这个“Android ViewPager左右滑动翻页含导航”的主题中,我们将深入探讨`ViewPager`的使用方法、功能特性以及如何结合其他组件构建高效的应用。 首先,`ViewPager`是Android Support Library的一部分,通常通过`...

    安卓Android源码——ViewPager和Tabhost结合,可滑动的tabhost.rar

    然而,由于`TabHost`的局限性(如无法滑动切换标签),在新的Android设计指南中,推荐使用`TabLayout`和`ViewPager`的组合来替代。 在这个示例中,开发者可能将`TabHost`和`ViewPager`结合起来,使得`TabHost`的...

    Android中ViewPager Fragment GridView的混合应用.pdf

    在Android开发中,混合使用ViewPager、Fragment和GridView可以构建出功能丰富且交互性强的移动应用。这篇文章主要探讨了如何在Android环境中巧妙地结合这三个组件,以实现动态展示大量数据并支持用户滚动和切换的...

    android studio项目实例viewpager2应用设计

    `ViewPager2`是Android支持库的一部分,它基于`RecyclerView`,因此继承了`RecyclerView`的高性能特性。与旧版`ViewPager`相比,`ViewPager2`支持水平和垂直方向的滑动,并且默认实现了右到左和左到右的切换方式。 ...

    android viewpager滑动用户引导欢迎页

    在Android开发中,`ViewPager`是一个非常常用的组件,它允许用户通过左右滑动来浏览多个页面,这种特性在实现用户引导或欢迎界面时尤为适用。本文将深入探讨如何使用`ViewPager`来创建一个滑动的用户引导欢迎页。 ...

    Android Viewpager侧滑切换界面

    `ViewPager`的一个重要特性是其自动处理页面预加载,即在用户当前可视页面的两侧加载额外的页面,这样在用户滑动时可以立即呈现新页面,提高用户体验。通过设置`setOffscreenPageLimit(int limit)`,可以控制缓存的...

Global site tag (gtag.js) - Google Analytics