软件启动旋转动画:

布局:

<RelativeLayout 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:id="@+id/rl_root"
android:background="@drawable/splash_bg_newyear" > <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/splash_horse_newyear"
/> </RelativeLayout>

Activity:

package com.itheima.zhbj52;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.widget.RelativeLayout; import com.itheima.zhbj52.utils.PrefUtils;
/**
* 旋转首屏页
*/
public class SplashActivity extends Activity {
RelativeLayout rlRoot;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
rlRoot = (RelativeLayout) findViewById(R.id.rl_root);//rl_root下面是一个ImageView是一张图片。
startAnim();
//LibUtils.doSomething();
//rlRoot.setBackgroundResource(R.drawable.newscenter_press);
} /**
* 开启动画
*/
private void startAnim() {
// 动画集合
AnimationSet set = new AnimationSet(false);
// 旋转动画
RotateAnimation rotate = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);//RELATIVE_TO_SELF表示自身旋转,0.5f表示自身中心。
rotate.setDuration(1000);// 动画时间
rotate.setFillAfter(true);// 保持动画最后的状态
// 缩放动画
ScaleAnimation scale = new ScaleAnimation(0, 1, 0, 1,//宽和高从0到1,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
scale.setDuration(1000);// 动画时间
scale.setFillAfter(true);// 保持动画状态
// 渐变动画
AlphaAnimation alpha = new AlphaAnimation(0, 1);
alpha.setDuration(2000);// 动画时间
alpha.setFillAfter(true);// 保持动画状态 set.addAnimation(rotate);
set.addAnimation(scale);
set.addAnimation(alpha);
// 设置动画监听
set.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {//动画重复的时候调用,
}
// 动画执行结束
@Override
public void onAnimationEnd(Animation animation) {
jumpNextPage();
}
});
rlRoot.startAnimation(set);
} /**
* 跳转下一个页面
*/
private void jumpNextPage() {
// 判断之前有没有显示过新手引导
boolean userGuide = PrefUtils.getBoolean(this, "is_user_guide_showed",
false);
if (!userGuide) {
// 跳转到新手引导页
startActivity(new Intent(SplashActivity.this, GuideActivity.class));
} else {
startActivity(new Intent(SplashActivity.this, MainActivity.class));
}
finish();//跳转到新页面后把当前页面结束
}
}

引导页面:

布局:

<?xml version="1.0" encoding="utf-8"?>

<!-- 整体是一个相对布局,这样才会让控件叠加到另一个控件上 -->
<RelativeLayout 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/vp_guide"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="60dp"
android:background="@drawable/btn_guide_selector" 按钮背景图片选择器
android:padding="5dp"
android:text="开始体验"
android:visibility="invisible"
android:textColor="@drawable/btn_guide_text_selector" /> 按钮文字选择器 <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp" > <!-- 3个黑色的圆点 -->
<LinearLayout
android:id="@+id/ll_point_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
<!-- 1个可以移动的红色圆点,默认压住第一个黑色圆点 -->
<View
android:id="@+id/view_red_point"
android:layout_width="10dp"
android:layout_height="10dp"
android:background="@drawable/shape_point_red" />
</RelativeLayout> </RelativeLayout>

Activity:

package com.itheima.zhbj52;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout; import com.itheima.zhbj52.utils.PrefUtils; /**
* 新手引导
*/
public class GuideActivity extends Activity { private static final int[] mImageIds = new int[] { R.drawable.guide_1,
R.drawable.guide_2, R.drawable.guide_3 };//三张图片
private ViewPager vpGuide;
private ArrayList<ImageView> mImageViewList;
private LinearLayout llPointGroup;// 引导圆点的父控件
private int mPointWidth;// 圆点间的距离
private View viewRedPoint;// 小红点
private Button btnStart;// 开始体验 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题,在setContentView方法之前调用。
setContentView(R.layout.activity_guide);
vpGuide = (ViewPager) findViewById(R.id.vp_guide);
llPointGroup = (LinearLayout) findViewById(R.id.ll_point_group);//3个黑色的圆点
viewRedPoint = findViewById(R.id.view_red_point);
btnStart = (Button) findViewById(R.id.btn_start);//开始体验按钮
btnStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 更新sp, 表示已经展示了新手引导
PrefUtils.setBoolean(GuideActivity.this,
"is_user_guide_showed", true);
// 跳转主页面
startActivity(new Intent(GuideActivity.this, MainActivity.class));
finish();//当前页面消失
}
});
initViews();
vpGuide.setAdapter(new GuideAdapter());//ViewPager要设置Adapter
vpGuide.setOnPageChangeListener(new GuidePageListener());//ViewPager滑动时的监听器
} /**
* 初始化界面
*/
private void initViews() {
mImageViewList = new ArrayList<ImageView>(); // 初始化引导页的3个页面
for (int i = 0; i < mImageIds.length; i++) {
ImageView image = new ImageView(this);
image.setBackgroundResource(mImageIds[i]);// 设置引导页背景
mImageViewList.add(image);
} // 动态初始化小圆点,便于代码的扩展。
for (int i = 0; i < mImageIds.length; i++) {
View point = new View(this);
point.setBackgroundResource(R.drawable.shape_point_gray);// 所有的View都有背景,
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
10, 10);//宽高为10像素,因为圆点的父控件是LinearLayout所以这里用LinearLayout.LayoutParams,
if (i > 0) {
params.leftMargin = 10;// 设置圆点间隔
}
point.setLayoutParams(params);// 设置圆点的大小
llPointGroup.addView(point);// 将圆点动态添加给线性布局
}
//控件出现的时候会经过measure()方法测量控件的宽高,layout()方法用来决定将控件放在哪个地方,ondraw()方法来画控件。
// 获取视图树(因为整个页面的布局是一层一层的xml节点树), 对layout方法结束的事件进行监听
llPointGroup.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
// 当layout方法执行结束后回调此方法
@Override
public void onGlobalLayout() {
System.out.println("layout 结束");
llPointGroup.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);//以后不再监听,this是OnGlobalLayoutListener对象,这是一个内部类。
mPointWidth = llPointGroup.getChildAt(1).getLeft()
- llPointGroup.getChildAt(0).getLeft();//getLeft()是返回圆点的左边到页面左边的距离,getRight()是返回圆点的右边到页面左边的距离。
System.out.println("圆点距离:" + mPointWidth);//
}
});
} /**
* ViewPager数据适配器
*/
class GuideAdapter extends PagerAdapter {
@Override
public int getCount() {
return mImageIds.length;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {//类似于listView的getView()方法,
container.addView(mImageViewList.get(position));//mImageViewList.get(position)返回的是ImageView,
return mImageViewList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);//删除一个
}
} /**
* viewpager的滑动监听
*/
class GuidePageListener implements OnPageChangeListener {
// 滑动事件,滑动的过程中这个方法一直调用。
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
//position是当前页面的位置,positionOffset偏移百分比,positionOffsetPixels是偏移的像素,
//从一个页面滑到第二个页面的时候positionOffset从0到100%并且到第二个页面的时候百分比又变为0,positionOffsetPixels从0到页面的宽度到达第二个页面的时候偏移量又淸0。
System.out.println("当前位置:" + position + ";百分比:" + positionOffset
+ ";移动距离:" + positionOffsetPixels);
int len = (int) (mPointWidth * positionOffset) + position
* mPointWidth;//mPointWidth * positionOffset是圆点的距离乘以移动的百分比,
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewRedPoint
.getLayoutParams();// 获取当前红点的布局参数,因为红色的点是在UI文件写的所以已经有了LayoutParams,而黑色的点是动态生成的没有LayoutParams,红色点的父节点是相对布局,
params.leftMargin = len;// 设置左边距
viewRedPoint.setLayoutParams(params);// 重新给小红点设置布局参数
} // 某个页面被选中
@Override
public void onPageSelected(int position) {
if (position == mImageIds.length - 1) {// 最后一个页面
btnStart.setVisibility(View.VISIBLE);// 显示开始体验的按钮
} else {
btnStart.setVisibility(View.INVISIBLE);
}
} // 滑动状态发生变化(正在滑动 滑动松开状态,)
@Override
public void onPageScrollStateChanged(int state) { } } }
<!-- 图片颜色选择器(drawable文件夹里面) -->

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/button_red_pressed" android:state_pressed="true"/> <!-- 被点击之后 -->
<item android:drawable="@drawable/button_red_normal"/> </selector>
<!-- 文字颜色选择器(drawable文件夹里面) -->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="@android:color/black"/> <!-- 文字点击后是黑色 -->
<item android:color="@android:color/white"/> <!-- 文字默认是白色 --> </selector>
<!-- 不可以移动的黑色的圆点 -->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" > <!-- shape下面的oval是圆形 --> <solid android:color="@android:color/darker_gray" /> <!-- 圆形是灰色 --> </shape>
<!-- 红色可以移动的圆点 -->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" > <solid android:color="#f00" /> <!-- 圆点颜色是红色 --> </shape>
package com.itheima.zhbj52.utils;

import android.content.Context;
import android.content.SharedPreferences; /**
* SharePreference封装
*
* @author Kevin
*
*/
public class PrefUtils { public static final String PREF_NAME = "config"; public static boolean getBoolean(Context ctx, String key,
boolean defaultValue) {
SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
return sp.getBoolean(key, defaultValue);
} public static void setBoolean(Context ctx, String key, boolean value) {
SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
sp.edit().putBoolean(key, value).commit();
}
}

清单文件:

<activity android:name=".GuideActivity" />
<activity android:name=".MainActivity" />

android120 zhihuibeijing 开机页面的更多相关文章

  1. 【技术】关于安卓使用禁用服务(或者是MYANDROIDTOOLS里面的禁用服务)后卡在开机页面的(或者是卡在各种页面的)

    目前会出现禁用部分服务后卡在开机页面,导致到手机数据得全部清除在网上找了很久,都没找到还原的方法只好自己开垦新方案了推测:由于格式化DATA分区后,手机可以正常开机,所以认为禁用服务的配置内容保存在D ...

  2. 老司机学新平台 - Xamarin Forms开发框架二探 (Prism vs MvvmCross)

    在上一篇Xamarin开发环境及开发框架初探中,曾简单提到MvvmCross这个Xamarin下的开发框架.最近又评估了一些别的,发现老牌Mvvm框架Prism现在也支持Xamarin Forms了, ...

  3. Win7与Mint双系统安装体验

    双系统安装前的准备 1.安装前的准备 安装双系统可能会对磁盘文件带来一些影响,为了避免在安装过程中由于系统瘫痪造成不必要的损失,所以我们在准备安装双系统之前,要对PC机中的重要文件进行备份,对资料要做 ...

  4. Linux的安全模式

    今天尝试了一下开机启动,在rc.local中进行设置,但是我写的java -jar transport.jar是一个Hold处理,无法退出:导致开机的时候一直停留在等待页面. 处理机制: 1. 在Li ...

  5. Prism vs MvvmCross

    Prism vs MvvmCross 在上一篇Xamarin开发环境及开发框架初探中,曾简单提到MvvmCross这个Xamarin下的开发框架.最近又评估了一些别的,发现老牌Mvvm框架Prism现 ...

  6. 最小化安装linux CentOS_7操作系统

    实验环境为VMware虚拟机安装操作系统. 1.打开VMware Workstation 虚拟机,选择创建新的虚拟机: 2.选择linux-CentOS 64位操作系统: 3.为虚拟机命名,并选择安装 ...

  7. Dell台式机Window10恢复重装window7步骤

    1.开机页面出现Dell标识时,连续点击F2 2.进入bois页面,选择boot ,将光标移动到USB启动盘符位置, 3.按 - 号,将 USB Srorage Device 改为第一启动项,F10保 ...

  8. win10切换AHCI模式

    win10切换AHCI模式 笔记本电脑总是卡卡的,开机好慢,一狠心就买了一个固态硬盘装上.听说电脑开启AHCI模式跟固态硬盘更配哦.所以好好得鼓捣了一下电脑. 保证win10开启了安全模式, 如果没有 ...

  9. 20165315 预备作业3 Linux安装及学习

    20165315 预备作业3 Linux安装及学习 一.在自己笔记本上安装Linux操作系统 因为对操作电脑的不熟悉,我在第一项任务上就花费了一定的时间,在安装过程有如下问题: 我的电脑是苹果公司的M ...

随机推荐

  1. [CF 471C] MUH and House of Cards

    C. MUH and House of Cards   Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elep ...

  2. MySQL 存储过程删除大表

    1.权限问题 alter routine 编辑或删除存储过程 create routine 建立存储过程 execute 创建存储过程 2.存储过程相关的一些命令 show procedure sta ...

  3. 第一章 Lambda表达式

    1.1 Why Lambdas? 当你操作多线程的时候,你会像下面这样将要处理的代码放到run()函数中: class Worker implements Runnable { public void ...

  4. string 常用 方法

    boost::array< char, 16 > header; string(header.begin(),header.end()) std::vector<uchar> ...

  5. 时间管理(GTD)

    今天中午看了30分钟老王讲战胜拖延症和时间管理  视频地址:多呗课堂 贴两个总结的图在此: 计划中使用的四象限法和十八分钟法很好. 今年多研究研究,实践一下Geting Things Done.

  6. java创建对象的四种方式

    1.最常见的 new 一个 2使用反射机制创建对象,直接调用非构造函数 Class obj=Class.forName("A"); A a=obj.newInstance(); C ...

  7. ACM2034

    /*人见人爱A-BProblem Description参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差, ...

  8. 关于main()和_tmain()

    1.两者的共同点 int _tmain(int argc, _TCHAR* argv[])    和  int main(int argc, char* argv[])  ,两者都是程序的主函数,两者 ...

  9. c功能实战

    1,linux C连接ftp实现简单的上传下载; libcurl/libftp/busybox; oracle查看用户信息 1. 查询oracle中所有用户信息 select * from dba_u ...

  10. Android问题-selection contains a component,button7,introduced in an ancestor and cannot be deleted.

    问题现象: 在开发Android时增加的控件想删除,可是删除时提示“Android问题-selection contains a component,button7,introduced in an ...