Android实现过渡动画、引导页 Android判断是否第一次启动App

目前的App在安装后,第一次打开,都会显示两秒左右的logo,然后进入引导页。如果关闭App,再重新打开,则只会显示logo,然后直接进入主页。

最近写了这个,记录一下。

首先是过渡动画,因为它不论App是否第一次启动都会显示。

这里我使用了Handler的postDelayed()方法。把过渡动画的Activity设为默认启动的Activity。在当前Activity中,执行postDelayed()方法,把延时的时长设为两秒即可。

过渡页面如下:transition_view.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"
  android:background="#fff"
  > 

  <ImageView
    android:src="@drawable/profile"
    android:layout_marginTop="80dp"
    android:layout_gravity="center"
    android:layout_width="100dp"
    android:layout_height="100dp" /> 

</LinearLayout>

这里因为我的图片背景是白色的,就没有设置LinearLayout的背景色了,如果Logo的背景色不一样,则可以进行设置。也可以直接用ImageView解决。

过渡Activity如下:TransitionActivity.java

package com.ikok.transitionandguidingpage; 

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.view.Window; 

/**
 * Created by Anonymous on 2016/3/25.
 */
public class TransitionActivity extends Activity { 

  boolean isFirstIn = false;
  private Intent intent; 

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

    final SharedPreferences sharedPreferences = getSharedPreferences("is_first_in_data",MODE_PRIVATE);
    isFirstIn = sharedPreferences.getBoolean("isFirstIn",true);
    new Handler().postDelayed(new Runnable() { 

      @Override
      public void run() {
        if (isFirstIn) {
//          Toast.makeText(TransitionActivity.this, "First log", Toast.LENGTH_SHORT).show();
          intent = new Intent(TransitionActivity.this, GuideActivity.class);
          TransitionActivity.this.startActivity(intent);
          TransitionActivity.this.finish();
        } else {
          intent = new Intent(TransitionActivity.this, MainActivity.class);
          TransitionActivity.this.startActivity(intent);
          TransitionActivity.this.finish();
        }
      }
    }, 2000); 

  } 

}

显示了过渡动画后,则需要判断是否是第一次启动App了。因为根据是否是第一次启动App会判断进入引导页还是主页。
因为这个判断并不是一次执行就不需再执行了,而是每次启动App的时候都需要进行判断。所以这个判断的数据需要持久化。

且为了判断的时间很短,就不需要进行访问数据库,或者网络访问等耗时操作了。直接使用 SharedPreferences  进行处理。

首先去指定 SharedPreferences  文件的名称,如果不存在则会创建一个。创建的文件存放在 /data/data/<package name>/shared_prefs/ 目录下。

第二个参数是指定对该文件的操作模式。默认是 MODE_PRIVATE ,和直接传入0是一样的,表示只有当前程序才能对这个文件进行读写操作。

MODE_MULTI_PROCESS 是用于多个程序对同一个 SharedPreferences  文件进行读写操作。

创建好了文件,接下来我们读取标志,看程序是否是第一次启动App。

getBoolean("isFirstIn",true); 这个是用来获取标志的,它是用来取出文件中对应的键值对。第一个参数是键,第二个参数是默认值。

它会取出对应键的值,如果没有这个键,或者没有值,则直接使用默认值,即第二个参数。因为我创建SharedPreferences  文件的时候并没有创建这个键值对。

所以,它是读不出对应的键的值的,则会直接获取到 true 值。则App判断为第一次启动。接下来使用Intent,根据值,则开启了引导页即 GuideActivity 。

引导页 页面如下:guide_view.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.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"> 

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

</LinearLayout>

这里是v4包下的ViewPager。引导页我决定使用ViewPager+FragmentPagerAdapter来实现。
如果我直接通过判断VIewPager是否是最后一页,再左滑进入App主页,ViewPager切换到主页时候会有一点问题。可能左滑了一点,但是还想看前两张引导页,再右滑,
结果是直接进入了App主页,而不是上一张。体验感很不好,所以考虑到最后一页上有一个按钮,来进行点击进入App主页。这样体验感会好一点。

引导页Activity如下:GuideAcitivity.java

package com.ikok.transitionandguidingpage; 

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Window; 

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

/**
 * Created by Anonymous on 2016/3/26.
 */
public class GuideActivity extends FragmentActivity { 

  private ViewPager mViewPager;
  private FragmentPagerAdapter mAdapter;
  private List<Fragment> mFragment = new ArrayList<Fragment>(); 

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

    mViewPager = (ViewPager) findViewById(R.id.viewpager); 

    Fragment guide1 = new Guide1();
    Fragment guide2 = new Guide2();
    Fragment guide3 = new Guide3(); 

    mFragment.add(guide1);
    mFragment.add(guide2);
    mFragment.add(guide3); 

    mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
      @Override
      public Fragment getItem(int position) {
        return mFragment.get(position);
      } 

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

    // 为ViewPager添加动画效果,3.0以上可用
    mViewPager.setPageTransformer(true,new DepthPageTransformer());
//    mViewPager.setPageTransformer(true,new ZoomOutPageTransformer());
    mViewPager.setAdapter(mAdapter); 

  }
}

中间创建了三个Fragment,去加载布局,布局就是在xml的根节点上添加了 background 属性。

这里我为ViewPager的切换添加了切换动画。使用的 Google 官方文档上列出的两种动画效果。

当然可以进行自定义切换动画,我本来自定义了一个切换20度角的切换动画,但觉得不是很好看就没放上来了。

切换动画,低版本不支持。又添加了 nineoldandroid ,来使动画兼容到低版本。

最后一个页面如下:guide_view3.xml

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

  <Button
    android:id="@+id/into_app_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="进入App"
    android:textColor="#fefefe"
    android:background="@drawable/button_shape"
    android:layout_alignParentBottom="true"
    android:layout_centerInParent="true"
    android:layout_marginBottom="50dp"
    /> 

</RelativeLayout>

第三页的代码如下: Guide3.java

package com.ikok.transitionandguidingpage; 

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button; 

/**
 * Created by Anonymous on 2016/3/27.
 */
public class Guide3 extends Fragment { 

  private Button mIntoAppBtn;
  private View view; 

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.guide_view3,container,false);
    return view;
  } 

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mIntoAppBtn = (Button) view.findViewById(R.id.into_app_btn);
    mIntoAppBtn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent(getActivity(), MainActivity.class);
        startActivity(intent); 

        SharedPreferences sharedPreferences = getActivity().getSharedPreferences("is_first_in_data", 0x0000);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("isFirstIn", false);
        editor.commit(); 

        getActivity().finish();
      }
    });
  }
}

这里我就对页面上的Button绑定了一个点击事件监听器。点击进入主页,并且修改判断是否第一次进入App的标志值。
通过 SharedPreferences.Editor 对象去修改标志值。然后 commit ,没有 commit 是没有进行更新保存的。

这里getSharedPreferences() 的第二个参数,我直接使用了 0x0000,十六进制的0。

因为当时我使用 MODE_PRIVATE 的时候报错,然后我就通过查源码,发现 MODE_PRIVATE 的值就是 0x0000,所以我直接使用了这个 0x0000。

为什么报错呢?因为 MODE_PRIVATE 是Context 里的变量,在 Fragment 里无法识别。如果一定要用,则使用 Context.MODE_PRIVATE。

为什么 Activity 能用呢?因为 Activity 继承了 Context, 而 Fragment 没有继承 Context。

本来我做的是在主页的Activity中去修改这个标志值。但是后面考虑到,如果不是第一次启动,每次进入到主页,都需要修改一次标志值,即使它没有变化,还是多做了很多无用功。所以在最后一页的点击事件里进行修改。标志值只需要修改一次,引导页也只出现一次,正好。

主页就是创建工程默认的主页了。

其他事项:

给Button加了样式属性。
button_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <!-- 填充的颜色 -->
  <solid android:color="#00FFFFFF" />
  <stroke android:color="#fefefe"
      android:width="1dp"
    />
  <!-- 设置按钮的四个角为弧形 -->
  <!-- android:radius 弧形的半径 -->
  <corners android:radius="5dip" /> 

  <!-- padding:Button里面的文字与Button边界的间隔 -->
  <padding
    android:left="10dp"
    android:top="10dp"
    android:right="10dp"
    android:bottom="10dp"
    />
</shape>

进入程序会出现一瞬间的空白,然后显示正常。这是因为AppTheme。这里我新建了一个空的样式。然后让默认启动的Activity去应用空的样式。
style.xml

<pre name="code" class="html"><resources> 

  <!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
  </style> 

  <!--空程序样式-->
  <style name="EmptyTheme"> 

  </style> 

</resources>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.ikok.transitionandguidingpage"> 

  <application
    android:allowBackup="true"
    android:icon="@drawable/profile"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity"> 

    </activity>
    <!--应用空样式-->
    <activity android:name=".TransitionActivity"
          android:theme="@style/EmptyTheme">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" /> 

        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name=".GuideActivity"> 

    </activity>
  </application> 

</manifest>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android完美实现平滑过渡的ViewPager广告条

    我们经常会看到有一些app的banner界面可以实现循环播放多个广告图片和手动滑动循环的效果.看到那样的效果,相信大家都会想到ViewPager,但是ViewPager并不支持循环翻页,所以要实现循环还得需要自己去动手.最后还有一个问题就是翻页到最后一页如何平滑过渡到首页的问题.这些都源于有人私信问我ViewPager广告条如何平滑过渡的问题,出于这个问题,我想着亲自实现并分享下吧,本篇就是为了解决这些问题而写的. 1.初始化布局 我们先来写一个ViewPager广告条的布局: <Relativ

  • Android启动引导页使用ViewPager实现

    我们在安装某个APP的时候,基本都会有一个引导页的提示,他们可以打广告,或者介绍新功能的加入和使用说明等. 一般都支持滑动并且下面有几个点,显示共有多少页和当前图片的位置,在IOS上这个实现起来比较简单,但在安卓上如何实现呢. 今天就和大家一起来学习用官方v4支持包下的ViewPager来实现这个效果. 先上图: 下面是我的实现,一个xml布局,一个GuideActivity和一个GuidePageAdapter.  先上XML. <?xml version="1.0" enco

  • Android开发实战之漂亮的ViewPager引导页

    目前很多软件安装时都会出现引导页面,用户体验很好. 下面就来DIY下: 因为视频上传很麻烦,所以截图了. 首先看看效果图: 点击小点可自由切换,滑动也可以自由切换,最后一个导航页添加了点击跳转. 开始实现引导页: 一.采集需要的图片放入drawable文件里 二.初始化每个导航页的视图 import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.suppo

  • RxJava两步打造华丽的Android引导页

    前言 之前的一篇文章:基于RxJava实现酷炫启动页 中,我们尝试了用RxJava实现酷炫的启动页,今天我们在此基础上加入首次使用APP时的引导页功能. 效果如下图: 思路:思路其实很简单,就是在WelcomeActivity 中setContentView()之前判断是否是首次打开APP,若是,则去启动引导页(WelcomeGuideActivity)并return:若不是,则直接setContentView(),然后启动动画再启动MainActivity. 一.WelcomeActivity

  • Android控件ViewPager实现带有动画的引导页

    ViewPager实现带有动画的引导页,供大家参考,具体内容如下 好了,又到我们学习基础控件的时候了,其实引导页很简单,就是五张图片而已 一.ViewPager实现传统的引导页 传统的ViewPager实现引导页和ListView是一样道理的,只是把ListView的Item换成图片,把BaseAdapter换成PagerAdapter,我们先来看下传统引导页的效果图 步骤一:编写xml文件 既然用到的是ViewPager,那么xml文件就必须要有ViewPager,细心的你,可能会发现最后一页

  • Android引导页面的简单实现

    第一次进入应用的时候,都会有一个引导页面,引导页面的实现起来也很简单,实现的方式也有很多,下面是自己写的一个引导页面的效果,大致的实现思路为: 最外层是一个FragmentActivity,里面包含4个fragment,在fragment中给ViewPager开一个循环,这样实现了图片播,其实效果就是在FragmentActivity中几个fragment滑动切换, fragment中ViewPager无限轮播和滑动切换: 下面为代码实现: public class MainActivity e

  • Android实现绕球心旋转的引导页效果

    现在很多APP都会出现Android实现绕球心旋转的引导页效果,一个类似小车一直在往前开的旋转式动画效果. 先看一下预览效果: 嗯,整体效果还算理想,基本实现了页面绕屏幕底部中心旋转. 这里我们用到了Android系统的一个组件ViewFlipper,该控件的主要作用是为其中的View切换提供动画效果,主要的方法如下: setInAnimation:设置View进入屏幕时的动画. setOutAnimation:设置View退出屏幕时的动画. showNext:调用该方法可以显示下一个View.

  • Android开发实现的ViewPager引导页功能(动态加载指示器)详解

    本文实例讲述了Android开发实现的ViewPager引导页功能(动态加载指示器).分享给大家供大家参考,具体如下: 先看效果图咯~ 现在几乎每个App都会有引导页,是不是感觉很炫很厉害,所以就想做出来一个学习一下~让自己的App看起来更加的美观~ 现在来分析一下: 这个引导页可以分为俩部分~ 1.小红点--来提醒这是第几页了~ 2."开始体验"这个Button--可以进入主界面,但是要控制这个Button只能在最后一页出现 布局的话使用相对布局~ 那现在来看看布局吧: activi

  • Android开发之无痕过渡下拉刷新控件的实现思路详解

    相信大家已经对下拉刷新熟悉得不能再熟悉了,市面上的下拉刷新琳琅满目,然而有很多在我看来略有缺陷,接下来我将说明一下存在的缺陷问题,然后提供一种思路来解决这一缺陷,废话不多说!往下看嘞! 1.市面一些下拉刷新控件普遍缺陷演示 以直播吧APP为例: 第1种情况: 滑动控件在初始的0位置时,手势往下滑动然后再往上滑动,可以看到滑动到初始位置时滑动控件不能滑动. 原因: 下拉刷新控件响应了触摸事件,后续的一系列事件都由它来处理,当滑动控件到顶端的时候,滑动事件都被下拉刷新控件消费掉了,传递不到它的子控件

  • Android UI设计与开发之使用ViewPager实现欢迎引导页面

    本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗? 最下方有源码的下载地址,几乎源码的每一行都有注释,写的通俗易懂,非常清晰,如有不懂的可以留言,本博主一定尽心尽力,为大家答题解惑,希望大家多多支持,好的,话不多说,让我们回归到今天的正题. 一.实现的效果图 也许是养成了这样一个习惯,每次看别人的代码前,必须要先看实现的效果图达到了一个什么样的效果,是不是跟自己想要实

随机推荐