黑马北京新闻项目连载(1)---引导界面

2024-08-31 23:38

本文主要是介绍黑马北京新闻项目连载(1)---引导界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看引导界面效果


先看欢迎界面的布局(动画效果)


activity_welcome.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:id="@+id/rl_root"  
  5.     android:background="@drawable/splash_bg_newyear" >  
  6.   
  7.     <ImageView  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"  
  10.         android:src="@drawable/splash_horse_newyear" />  
  11.   
  12. </RelativeLayout>  


再看欢迎界面的activity

WelcomeActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.bjnews.activity;  
  2.   
  3. import com.example.bjnews.R;  
  4. import com.example.bjnews.util.SPUtil;  
  5.   
  6. import android.os.Bundle;  
  7. import android.util.Log;  
  8. import android.view.animation.AlphaAnimation;  
  9. import android.view.animation.Animation;  
  10. import android.view.animation.Animation.AnimationListener;  
  11. import android.view.animation.AnimationSet;  
  12. import android.view.animation.RotateAnimation;  
  13. import android.view.animation.ScaleAnimation;  
  14. import android.widget.RelativeLayout;  
  15. import android.widget.Toast;  
  16. import android.app.Activity;  
  17. import android.content.Intent;  
  18.   
  19. public class WelcomeActivity extends Activity {  
  20.     private RelativeLayout rl_root;  
  21.       
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_welcome);  
  26.         init();  
  27.     }  
  28.   
  29.     private void init() {  
  30.         rl_root = (RelativeLayout) findViewById(R.id.rl_root);  
  31.         //旋转  
  32.         RotateAnimation rotateAnimation = new RotateAnimation(0360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  
  33.         rotateAnimation.setDuration(2000);  
  34.         rotateAnimation.setFillAfter(true);  
  35.         //缩放  
  36.         ScaleAnimation scaleAnimation = new ScaleAnimation(0101, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  
  37.         scaleAnimation.setDuration(2000);  
  38.         scaleAnimation.setFillAfter(true);  
  39.         //透明度  
  40.         AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);  
  41.         alphaAnimation.setDuration(2000);  
  42.         alphaAnimation.setFillAfter(true);  
  43.         //添加动画  
  44.         AnimationSet animationSet = new AnimationSet(false);  
  45.         animationSet.addAnimation(rotateAnimation);  
  46.         animationSet.addAnimation(scaleAnimation);  
  47.         animationSet.addAnimation(alphaAnimation);  
  48.         rl_root.startAnimation(animationSet);  
  49.           
  50.         //动画监听事件  
  51.         animationSet.setAnimationListener(new MyAnimation());  
  52.     }  
  53.     class MyAnimation implements AnimationListener{  
  54.   
  55.         @Override  
  56.         public void onAnimationEnd(Animation animation) {  
  57.             //是否已经进入过主界面(默认没有进入过)  
  58.             boolean isEnterMain = SPUtil.getInstance(WelcomeActivity.this).getboolean("isEnterMain"false);  
  59.               
  60.             Log.e("TAG""isEnterMain"+isEnterMain);  
  61.             if (isEnterMain) {  
  62.                 //进入过,进入到主界面  
  63.                 startActivity(new Intent(WelcomeActivity.this,MainActivity.class ));  
  64.                 Log.e("TAG""Main");  
  65.             }else {  
  66.                 //没进入过,计入向导界面  
  67.                 Log.e("TAG""guide");  
  68.                 startActivity(new Intent(WelcomeActivity.this,GuideActivity.class ));  
  69.             }  
  70.             finish();  
  71.         }  
  72.   
  73.         @Override  
  74.         public void onAnimationRepeat(Animation animation) {  
  75.               
  76.         }  
  77.   
  78.         @Override  
  79.         public void onAnimationStart(Animation animation) {  
  80.               
  81.         }  
  82.           
  83.     }  
  84. }  
另外为上对象提供一个工具类(用来保存是否是第一次进入应用)

SPUtil.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.bjnews.util;  
  2.   
  3. import android.content.Context;  
  4. import android.content.SharedPreferences;  
  5. import android.content.SharedPreferences.Editor;  
  6.   
  7. public class SPUtil {  
  8.     // 构造器私有  
  9.     private SPUtil() {  
  10.     }  
  11.   
  12.     // 私有、静态实例  
  13.     private static SPUtil instance = new SPUtil();  
  14.   
  15.     // 公共、静态方法获取实例  
  16.     public static SPUtil getInstance(Context context) {  
  17.         if (sp == null) {  
  18.             sp = context.getSharedPreferences("atguigu", Context.MODE_PRIVATE);  
  19.         }  
  20.         return instance;  
  21.     }  
  22.   
  23.     private static SharedPreferences sp;  
  24.   
  25.     // 保存数据的方法  
  26.     public void put(String key, Object defValue) {  
  27.           
  28.         Editor edit = sp.edit();  
  29.         if (defValue instanceof Boolean) {  
  30.             edit.putBoolean(key, (Boolean) defValue);  
  31.         }  
  32.         if (defValue instanceof String) {  
  33.             edit.putString(key, (String) defValue);  
  34.         }  
  35.         if (defValue instanceof Integer) {  
  36.             edit.putInt(key, (Integer) defValue);  
  37.         }  
  38.         edit.commit();  
  39.           
  40.     }  
  41.   
  42.     // 获取数据  
  43.     public String getString(String key, String defValue) {  
  44.         return sp.getString(key, defValue);  
  45.     }  
  46.   
  47.     public int getInt(String key, int defValue) {  
  48.         return sp.getInt(key, defValue);  
  49.     }  
  50.   
  51.     public boolean getboolean(String key, boolean defValue) {  
  52.         return sp.getBoolean(key, defValue);  
  53.     }  
  54. }  

接下来开始进行引导界面的操作了 

先看布局

activity_guide.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent" >  
  4.   
  5.     <android.support.v4.view.ViewPager  
  6.         android:id="@+id/viewpager"  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="fill_parent" >  
  9.     </android.support.v4.view.ViewPager>  
  10.   
  11.     <Button  
  12.         android:id="@+id/btn_enterMain"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_alignParentBottom="true"  
  16.         android:layout_centerHorizontal="true"  
  17.         android:layout_marginBottom="100dp"  
  18.         android:background="@drawable/enter_main_button_selector_bg"  
  19.         android:text="开始体验"  
  20.         android:textColor="@drawable/enter_main_button_text_selector"  
  21.         android:visibility="gone" />  
  22.   
  23.     <RelativeLayout  
  24.         android:layout_width="wrap_content"  
  25.         android:layout_height="wrap_content"  
  26.         android:layout_alignParentBottom="true"  
  27.         android:layout_centerHorizontal="true"  
  28.         android:layout_marginBottom="80dp" >  
  29.   
  30.         <LinearLayout  
  31.             android:id="@+id/ll_point_group"  
  32.             android:layout_width="wrap_content"  
  33.             android:layout_height="wrap_content"  
  34.             android:orientation="horizontal" >  
  35.         </LinearLayout>  
  36.   
  37.         <View  
  38.             android:id="@+id/red_point"  
  39.             android:layout_width="10dp"  
  40.             android:layout_height="10dp"  
  41.             android:background="@drawable/point_red"/>  
  42.     </RelativeLayout>  
  43.   
  44. </RelativeLayout>  
针对引导界面还需要提供4个xml文件(进入体验button的按下效果切换,以及还有3个状态切换圆点)
enter_main_button_selector_bg.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.     <item android:state_checked="true" android:drawable="@drawable/button_red_pressed"></item>  
  4.     <item android:state_checked="false" android:drawable="@drawable/button_red_normal"></item>  
  5.   
  6. </selector>  

enter_main_button_text_selector.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.     <item android:state_checked="true" android:color="@android:color/black"></item>  
  4.     <item android:state_checked="false" android:color="@android:color/white"></item>  
  5.   
  6. </selector>  

point_normal.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">  
  3.     <solid android:color="#55000000"/>  
  4. </shape>  
point_red.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">  
  3.     <solid android:color="#ff0000"/>  
  4. </shape>  

接下来就该注意的向导界面代码了

GuideActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.bjnews.activity;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Intent;  
  7. import android.os.Bundle;  
  8. import android.support.v4.view.PagerAdapter;  
  9.   
  10. import android.support.v4.view.ViewPager;  
  11. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.view.ViewTreeObserver.OnGlobalLayoutListener;  
  15. import android.widget.Button;  
  16. import android.widget.ImageView;  
  17. import android.widget.LinearLayout;  
  18. import android.widget.LinearLayout.LayoutParams;  
  19. import android.widget.RelativeLayout;  
  20.   
  21. import com.example.bjnews.R;  
  22. import com.example.bjnews.util.SPUtil;  
  23.   
  24. public class GuideActivity extends Activity {  
  25.     private ViewPager viewpager;// 三个滑动的页面  
  26.     private ArrayList<ImageView> imageViews;// 三个滑动页面对应的图片集合  
  27.     private Button btn_enterMain;// 开始体验按钮  
  28.   
  29.     private LinearLayout ll_point_group;// 下方的三个显示圆点为  
  30.     private View red_point;// 当前页面的高亮显示圆点  
  31.   
  32.     private int leftMax;// 2个原点之前的距离  
  33.   
  34.     @Override  
  35.     protected void onCreate(Bundle savedInstanceState) {  
  36.         super.onCreate(savedInstanceState);  
  37.         setContentView(R.layout.activity_guide);  
  38.         // 获取点的集合  
  39.         ll_point_group = (LinearLayout) findViewById(R.id.ll_point_group);  
  40.         // 获取高亮的红点  
  41.         red_point = findViewById(R.id.red_point);  
  42.         // 获取viewpager  
  43.         viewpager = (ViewPager) findViewById(R.id.viewpager);  
  44.         // 获取button(开始体验)  
  45.         btn_enterMain = (Button) findViewById(R.id.btn_enterMain);  
  46.         // 创建集合  
  47.         imageViews = new ArrayList<ImageView>();  
  48.   
  49.         // 准备数据  
  50.         int[] ids = { R.drawable.guide_1, R.drawable.guide_2,  
  51.                 R.drawable.guide_3 };  
  52.         for (int i = 0; i < ids.length; i++) {  
  53.             ImageView imageView = new ImageView(this);// 创建图片对象  
  54.             imageView.setBackgroundResource(ids[i]);// 为图片设置背景  
  55.             imageViews.add(imageView);// 添加图片  
  56.             View point = new View(this);// 添加下标点-创建点击  
  57.             LayoutParams params = new LayoutParams(1010);// 创建布局参数  
  58.             // 除开第0个点,其他的都要距离左边有10个像素  
  59.             if (i != 0) {  
  60.                 params.leftMargin = 10;  
  61.             }  
  62.   
  63.             point.setBackgroundResource(R.drawable.point_normal);// 添加背景图片  
  64.   
  65.             point.setLayoutParams(params);// 设置布局参数  
  66.   
  67.             ll_point_group.addView(point);// 添加指示点击  
  68.   
  69.         }  
  70.   
  71.         // 设置适配器  
  72.         viewpager.setAdapter(new viewpagerAdapter());  
  73.   
  74.         // 监听当onLayout方法执行的时候再去  
  75.         red_point.getViewTreeObserver().addOnGlobalLayoutListener(  
  76.                 new OnGlobalLayoutListener() {  
  77.                     @Override  
  78.                     public void onGlobalLayout() {  
  79.   
  80.                         // 取消注册监听--因为孩子也会调用  
  81.                         red_point.getViewTreeObserver()  
  82.                                 .removeGlobalOnLayoutListener(this);  
  83.                         // 两点间的间距  
  84.                         leftMax = ll_point_group.getChildAt(1).getLeft()  
  85.                                 - ll_point_group.getChildAt(0).getLeft();  
  86.                     }  
  87.                 });  
  88.   
  89.         /** 
  90.          * 设置页面改变监听 
  91.          */  
  92.         viewpager.setOnPageChangeListener(new OnPageChangeListener() {  
  93.   
  94.             @Override  
  95.             public void onPageSelected(int position) {  
  96.                 //只有第三种页面显示进入按钮  
  97.                 if (position == 2) {  
  98.                     btn_enterMain.setVisibility(View.VISIBLE);  
  99.                 } else {  
  100.                     btn_enterMain.setVisibility(View.GONE);  
  101.                 }  
  102.             }  
  103.   
  104.             /* 
  105.              * 位置 屏幕上滑动的百分比 滑动的显示 
  106.              */  
  107.             @Override  
  108.             public void onPageScrolled(int position, float positionOffset,  
  109.                     int positionOffsetPixels) {  
  110.                 // 计算要滑动的距离=间距*在屏幕上滑动的百分比  
  111.                 int distance = (int) (leftMax * (positionOffset + position));  
  112.                 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(  
  113.                         1010);  
  114.                 params.leftMargin = distance;  
  115.                 red_point.setLayoutParams(params);  
  116.             }  
  117.   
  118.             @Override  
  119.             public void onPageScrollStateChanged(int arg0) {  
  120.   
  121.             }  
  122.         });  
  123.         /** 
  124.          * 为开始体验button添加点击事件 
  125.          */  
  126.         btn_enterMain.setOnClickListener(new View.OnClickListener() {  
  127.   
  128.             @Override  
  129.             public void onClick(View v) {  
  130.                 // 标记为true  
  131.                 SPUtil.getInstance(GuideActivity.this).put("isEnterMain"true);  
  132.                 // 进入主界面  
  133.                 startActivity(new Intent(GuideActivity.this, MainActivity.class));  
  134.                 // 干掉自己  
  135.                 finish();  
  136.             }  
  137.         });  
  138.     }  
  139.   
  140.     class viewpagerAdapter extends PagerAdapter {  
  141.         @Override  
  142.         public int getCount() {  
  143.             return imageViews.size();  
  144.         }  
  145.   
  146.         @Override  
  147.         public boolean isViewFromObject(View arg0, Object arg1) {  
  148.             return (arg0 == arg1);  
  149.         }  
  150.   
  151.         @Override  
  152.         public void destroyItem(ViewGroup container, int position, Object object) {  
  153.             container.removeView((View) object);  
  154.         }  
  155.   
  156.         @Override  
  157.         public Object instantiateItem(ViewGroup container, int position) {  
  158.             ImageView imageView = imageViews.get(position);  
  159.             container.addView(imageView);  
  160.   
  161.             return imageView;  
  162.         }  
  163.     }  
  164. }  


另外最后还有一个主界面测试用(布局文件没有东西)

activity_main.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent" >  
  4.   
  5. </RelativeLayout>  

MainActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.bjnews.activity;  
  2.   
  3. import com.example.bjnews.R;  
  4.   
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7.   
  8. public class MainActivity extends Activity {  
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         // TODO Auto-generated method stub  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.activity_main);  
  14.     }  
  15. }  

这篇关于黑马北京新闻项目连载(1)---引导界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125327

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ