软件启动旋转动画:

布局:

<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" ><ImageViewandroid: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;@Overrideprotected 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() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationRepeat(Animation animation) {//动画重复的时候调用,
            }// 动画执行结束
            @Overridepublic 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.ViewPagerandroid:id="@+id/vp_guide"android:layout_width="match_parent"android:layout_height="match_parent" /><Buttonandroid: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" />   按钮文字选择器  <RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="20dp" ><!-- 3个黑色的圆点 --><LinearLayoutandroid:id="@+id/ll_point_group"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ></LinearLayout><!-- 1个可以移动的红色圆点,默认压住第一个黑色圆点 --><Viewandroid: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;// 开始体验
@Overrideprotected 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() {@Overridepublic 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要设置AdaptervpGuide.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方法执行结束后回调此方法
                    @Overridepublic 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);//20
                    }});}/*** ViewPager数据适配器*/class GuideAdapter extends PagerAdapter {@Overridepublic int getCount() {return mImageIds.length;}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {//类似于listView的getView()方法,container.addView(mImageViewList.get(position));//mImageViewList.get(position)返回的是ImageView,return mImageViewList.get(position);}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);//删除一个
        }}/*** viewpager的滑动监听*/class GuidePageListener implements OnPageChangeListener {// 滑动事件,滑动的过程中这个方法一直调用。
        @Overridepublic 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);// 重新给小红点设置布局参数
        }// 某个页面被选中
        @Overridepublic void onPageSelected(int position) {if (position == mImageIds.length - 1) {// 最后一个页面btnStart.setVisibility(View.VISIBLE);// 显示开始体验的按钮} else {btnStart.setVisibility(View.INVISIBLE);}}// 滑动状态发生变化(正在滑动   滑动松开状态,)
        @Overridepublic 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. 联想一直提示正在更新计算机启动配置,联想笔记本开机页面一直停留在准备配置windows 请勿关闭计算机 也没有以...

    联想笔记本开机页面一直停留在准备配置windows 请勿关闭计算机 也没有以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧 ...

  2. centos7 无法启动,停留在开机页面,报错 A start job is running for /etc/rc.d/rc.local compatibility 解决办法

    问题描述 centos7 部署的服务因服务器IP更换,出现报错"A start job is running for /etc/rc.d/rc.local compatibility &qu ...

  3. 苹果手机升级13无法开机_苹果11更新ios13.7卡在开机页面

    如果屏幕显示黑屏或死机 如果屏幕显示黑屏或死机,您可能需要强制重新启动设备.强制重新启动设备不会抹掉设备上的内容.即使屏幕黑屏或按钮没有响应,也可以强制重新启动设备.请按照以下步骤操作:配备面容 ID ...

  4. 重装Ubuntu 20.04第一次重启,开机页面卡住

    场景:电脑重装Ubuntu 20.04系统 设备:联想小新pro14 1.开机时,迅速按F12进入"please select boot device"选项,选中Ubuntu,点击 ...

  5. Ubuntu开机报错:could not update ICEauthority file /home/lstanding/.ICEauthority 并且不能进入开机页面

    问题如题, 如果你也是和我一样,出现了这个问题并且不能登入,那么,恭喜你,你将再次学习到一些新的东西了. 不要慌,进入到登陆界面的时候 首先:按下CTRL+ALT+F1组合键, 在login命令行输入 ...

  6. 虚拟机安装mac系统,在开机页面无限重启情况

    当我们在使用虚拟机安装苹果的mac系统时,出现开机无限重启的情况,这时,我们需要找到我们安装mac系统的位置,小编以自己的电脑路径为例:(找不到的可以右击你的虚拟机mac的系统:打开虚拟机目录) 找到 ...

  7. 手贱对mac进行了系统更新到 macOS Big Sur 出现系统异常导致开不了机,一直卡在开机页面,解决过程。

    周末在家看电视,看到有弹出系统更新提示,又联想到自己的系统版本太低,安装xcode好像出现了问题,flutter开发也不受影响,但是还是想完美一点,flutter doctor 不报任何错误. 结果就 ...

  8. 计算机任务管理器设置软件启动,电脑软件开机自动启动,教你一招禁止启动,能够有效提升开机速度...

    往往在我们的理论观念里,电脑有了固态硬盘运行速度就会加速,所以以为无论是什么时候都是一样的运行速度. 其实不然,就有一个网友与我说,他自己的电脑是固态硬盘的,却不知道为什么大原因,电脑怎么启动的没有以 ...

  9. root卡开机画面不动了,手机root卡住不动

    华为手机停留在开机画面(root过) 可能是挤压到开关机键和音量键误进入了刷机模式Recovery模式.请长按电源键10秒左右强制重启手机即可正常进入系统.如果强制重启仍无法恢复,请进行以下操作: 1 ...

最新文章

  1. 两分钟让你知道什么是“Java重载”
  2. jCryptoJS 、C#互通加密(MD5版)
  3. java string isempty,java – String.isEmpty()和String.equals(“”)之间的区别
  4. 【蓝桥杯】基础练习 十进制转十六进制
  5. rxjs的pipe和map配合使用的单步调试
  6. python sendto函数返回值_有返回值的函数amp;闭包(python)
  7. 苏州大学计算机科学研究生,报录比最高专业TOP10!就离谱!
  8. 如何利用FNDLOAD更新FORM的Personalization(Moving Personalizations between instances)
  9. Nginx端口映射(外网访问)
  10. Linux命令 ls -l s输出内容含义详解
  11. JavaScript网页开发--三.CSS(级联样式表)
  12. CSDN账号被盗了吗?
  13. 图像识别技术原理和神经网络的图像识别技术
  14. 无奈人心渐开明 贪嗔痴恨爱恶欲
  15. Linux 基础入门 07
  16. UltraISO刻录系统映象出现“此光盘不是空白光盘”
  17. 《Excel视频9》布尔值、and or
  18. uniapp中字体加粗问题
  19. lqc_脚本综合练习
  20. 安科瑞导轨式智能通讯管理机

热门文章

  1. 在网页中给Flash加上超级链接
  2. 用 Python 读写 Excel 表格,就是这么的简单粗暴且乏味
  3. 剖析 | torch.nn.functional.softmax维度详解
  4. html转换成keynote,keynote代码高亮【转】
  5. 超融合和服务器关系_关于超融合一体机,联想有话说
  6. hystrix是什么?
  7. Zookeeper基于Java 访问-权限控制的案例演示
  8. 设计模式在Netty中的应用-责任链模式源码举例
  9. MyBatis 源码解读-带着问题去看源码
  10. 基于Xml 的IOC 容器-将配置载入内存