乐乐音乐播放器(三) 第一次引导页面

源码地址: http://www.eoeandroid.com/thread-584730-1-1.html

应用在第一次启动时,应先进入引导页面。怎样判断应用是否是第一次使用呢?这里我使用SharedPreferences 和 酷狗的 引导页面为例子,大概看了一下酷狗apk包里面的图片,发现酷狗的文字动画 里的文字 原来是 图片文字,不过这里我 就不用它 的图片文字,而是用textview来实现。

首先定义一个 Constants 类来 储存 SharedPreferences 配置文件的 内容。

  1. package com.happy.common;
  2. public class Constants {
  3. /**
  4. * --------------------------应用配置--------------------------
  5. **/
  6. /**
  7. * 配置文件的名称
  8. */
  9. public static String PREFERENCE_NAME = "happy.sharepreference.name";
  10. /**
  11. * 是否是第一次运行的key
  12. */
  13. public static String ISFIRST_KEY = "ISFIRST_KEY";
  14. /**
  15. * 是否是第一次运行
  16. */
  17. public static boolean ISFIRST = true;
  18. }

复制代码

添加一个类 DataUtil 来处理 SharedPreferences 配置文件的内容

  1. package com.happy.util;
  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  4. import android.content.SharedPreferences.Editor;
  5. import com.happy.common.Constants;
  6. /**
  7. * SharedPreferences配置文件处理
  8. *
  9. * @author zhangliangming
  10. *
  11. */
  12. public class DataUtil {
  13. private static SharedPreferences preferences;
  14. /**
  15. * 初始化,将所有配置文件里的数据赋值给Constants
  16. *
  17. * @param context
  18. */
  19. public static void init(Context context) {
  20. if (preferences == null) {
  21. preferences = context.getSharedPreferences(
  22. Constants.PREFERENCE_NAME, 0);
  23. }
  24. }
  25. /**
  26. * 保存数据到SharedPreferences配置文件
  27. *
  28. * @param context
  29. * @param key
  30. *            关键字
  31. * @param data
  32. *            要保存的数据
  33. */
  34. public static void saveValue(Context context, String key, Object data) {
  35. if (preferences == null) {
  36. preferences = context.getSharedPreferences(
  37. Constants.PREFERENCE_NAME, 0);
  38. }
  39. Editor editor = preferences.edit();
  40. if (data instanceof Boolean) {
  41. editor.putBoolean(key, (Boolean) data);
  42. } else if (data instanceof Integer) {
  43. editor.putInt(key, (Integer) data);
  44. } else if (data instanceof String) {
  45. editor.putString(key, (String) data);
  46. } else if (data instanceof Float) {
  47. editor.putFloat(key, (Float) data);
  48. } else if (data instanceof Long) {
  49. editor.putFloat(key, (Long) data);
  50. }
  51. // 提交修改
  52. editor.commit();
  53. }
  54. /**
  55. * 从SharedPreferences配置文件中获取数据
  56. *
  57. * @param context
  58. * @param key
  59. *            关键字
  60. * @param defData
  61. *            默认获取的数据
  62. * @return
  63. */
  64. public static Object getValue(Context context, String key, Object defData) {
  65. if (preferences == null) {
  66. preferences = context.getSharedPreferences(
  67. Constants.PREFERENCE_NAME, 0);
  68. }
  69. if (defData instanceof Boolean) {
  70. return preferences.getBoolean(key, (Boolean) defData);
  71. } else if (defData instanceof Integer) {
  72. return preferences.getInt(key, (Integer) defData);
  73. } else if (defData instanceof String) {
  74. return preferences.getString(key, (String) defData);
  75. } else if (defData instanceof Float) {
  76. return preferences.getFloat(key, (Float) defData);
  77. } else if (defData instanceof Long) {
  78. return preferences.getLong(key, (Long) defData);
  79. }
  80. return null;
  81. }
  82. }

复制代码

修改 SplashActivity 的内容

  1. package com.happy.ui;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.AsyncTask;
  5. import android.os.Bundle;
  6. import android.os.Handler;
  7. import android.os.Message;
  8. import android.view.Menu;
  9. import android.widget.ImageView;
  10. import com.happy.common.Constants;
  11. import com.happy.util.DataUtil;
  12. public class SplashActivity extends Activity {
  13. /**
  14. * 跳转到主页面
  15. */
  16. private final int GOHOME = 0;
  17. /**
  18. * 跳转到引导页面
  19. */
  20. private final int GOGUIDE = 1;
  21. /**
  22. * 页面停留时间 3s
  23. */
  24. private final int SLEEPTIME = 3000;
  25. /**
  26. * splash ImageView
  27. */
  28. private ImageView splashImageView = null;
  29. private Handler mHandler = new Handler() {
  30. @Override
  31. public void handleMessage(Message msg) {
  32. switch (msg.what) {
  33. case GOHOME:
  34. goHome();
  35. break;
  36. case GOGUIDE:
  37. goGuide();
  38. break;
  39. default:
  40. break;
  41. }
  42. }
  43. };
  44. @Override
  45. protected void onCreate(Bundle savedInstanceState) {
  46. super.onCreate(savedInstanceState);
  47. setContentView(R.layout.activity_splash);
  48. init();
  49. loadData();
  50. }
  51. @Override
  52. public boolean onCreateOptionsMenu(Menu menu) {
  53. getMenuInflater().inflate(R.menu.splash, menu);
  54. return true;
  55. }
  56. private void init() {
  57. splashImageView = (ImageView) findViewById(R.id.splash);
  58. splashImageView.setBackgroundResource(R.drawable.splash);
  59. }
  60. private void loadData() {
  61. new AsyncTask<String, Integer, Integer>() {
  62. @Override
  63. protected Integer doInBackground(String... params) {
  64. boolean isFrist = (Boolean) DataUtil.getValue(
  65. SplashActivity.this, Constants.ISFIRST_KEY,
  66. Constants.ISFIRST);
  67. // 第一次执行
  68. if (isFrist) {
  69. return GOGUIDE;
  70. }
  71. // 配置数据初始化
  72. DataUtil.init(SplashActivity.this);
  73. return GOHOME;
  74. }
  75. @Override
  76. protected void onPostExecute(Integer result) {
  77. // 根据返回的result 跳转到不同的页面
  78. mHandler.sendEmptyMessageDelayed(result, SLEEPTIME);
  79. }
  80. }.execute("");
  81. }
  82. /**
  83. * 跳转到引导页面
  84. */
  85. protected void goGuide() {
  86. Intent intent = new Intent(this, GuideActivity.class);
  87. startActivity(intent);
  88. // 添加界面切换效果,注意只有Android的2.0(SdkVersion版本号为5)以后的版本才支持
  89. int version = Integer.valueOf(android.os.Build.VERSION.SDK);
  90. if (version >= 5) {
  91. overridePendingTransition(R.anim.anim_in, R.anim.anim_out);
  92. }
  93. finish();
  94. }
  95. /**
  96. * 跳转到主界面
  97. */
  98. protected void goHome() {
  99. Intent intent = new Intent(this, MainActivity.class);
  100. startActivity(intent);
  101. // 添加界面切换效果,注意只有Android的2.0(SdkVersion版本号为5)以后的版本才支持
  102. int version = Integer.valueOf(android.os.Build.VERSION.SDK);
  103. if (version >= 5) {
  104. overridePendingTransition(R.anim.anim_in, R.anim.anim_out);
  105. }
  106. finish();
  107. }
  108. }

复制代码

添加 GuideActivity 引导页面

  1. package com.happy.ui;
  2. import java.util.ArrayList;
  3. import android.graphics.Color;
  4. import android.os.Bundle;
  5. import android.support.v4.app.Fragment;
  6. import android.support.v4.app.FragmentActivity;
  7. import android.support.v4.app.FragmentManager;
  8. import android.support.v4.app.FragmentPagerAdapter;
  9. import android.support.v4.view.ViewPager;
  10. import android.support.v4.view.ViewPager.OnPageChangeListener;
  11. import android.view.KeyEvent;
  12. import android.view.Menu;
  13. import android.widget.ImageView;
  14. import android.widget.Toast;
  15. import com.happy.fragment.GuideFragment;
  16. import com.happy.manage.ActivityManage;
  17. public class GuideActivity extends FragmentActivity {
  18. private ViewPager viewPager;
  19. private TabFragmentPagerAdapter tabFragmentPagerAdapter;
  20. /**
  21. * 页面列表
  22. */
  23. private ArrayList<Fragment> fragmentList;
  24. private GuideFragment firstGuideFragment;
  25. private GuideFragment secondGuideFragment;
  26. private GuideFragment thirdGuideFragment;
  27. private GuideFragment fourthGuideFragment;
  28. /** 将小圆点的图片用数组表示 */
  29. private ImageView[] imageViews;
  30. /**
  31. * 当前索引
  32. */
  33. private int TAB_INDEX = 0;
  34. private long mExitTime;
  35. @Override
  36. protected void onCreate(Bundle savedInstanceState) {
  37. super.onCreate(savedInstanceState);
  38. setContentView(R.layout.activity_guide);
  39. init();
  40. // 将activity添加到ActivityManage
  41. ActivityManage.getInstance().addActivity(this);
  42. }
  43. @Override
  44. public boolean onCreateOptionsMenu(Menu menu) {
  45. getMenuInflater().inflate(R.menu.guide, menu);
  46. return true;
  47. }
  48. /**
  49. * 初始化
  50. */
  51. private void init() {
  52. viewPager = (ViewPager) findViewById(R.id.viewpager);
  53. fragmentList = new ArrayList<Fragment>();
  54. //
  55. firstGuideFragment = new GuideFragment();
  56. firstGuideFragment.setParentRelativeLayoutColor(Color
  57. .rgb(163, 161, 212));
  58. firstGuideFragment.setMainTitleText("猜你喜欢");
  59. firstGuideFragment.setSecondTitleText("总能猜到,你爱听的。");
  60. firstGuideFragment.setCentPICImage(R.drawable.guide_first_person);
  61. firstGuideFragment.setInitAni(true);
  62. //
  63. secondGuideFragment = new GuideFragment();
  64. secondGuideFragment.setParentRelativeLayoutColor(Color.rgb(254, 153,
  65. 153));
  66. secondGuideFragment.setMainTitleText("蝰蛇音效");
  67. secondGuideFragment.setSecondTitleText("三大神器,听觉重生。");
  68. secondGuideFragment.setCentPICImage(R.drawable.guide_second_person);
  69. //
  70. thirdGuideFragment = new GuideFragment();
  71. thirdGuideFragment
  72. .setParentRelativeLayoutColor(Color.rgb(225, 184, 94));
  73. thirdGuideFragment.setMainTitleText("听歌识曲");
  74. thirdGuideFragment.setSecondTitleText("全新改版,更快更准。");
  75. thirdGuideFragment
  76. .setCentPICImage(R.drawable.guide_third_bottom_person);
  77. //
  78. fourthGuideFragment = new GuideFragment();
  79. fourthGuideFragment.setParentRelativeLayoutColor(Color
  80. .rgb(77, 199, 255));
  81. fourthGuideFragment.setMainTitleText("K歌送礼");
  82. fourthGuideFragment.setSecondTitleText("免费领K币,送礼推榜首。");
  83. fourthGuideFragment
  84. .setCentPICImage(R.drawable.guide_four_bottom_person);
  85. fourthGuideFragment.setGoToImageViewVisibility(true);
  86. //
  87. fragmentList.add(firstGuideFragment);
  88. fragmentList.add(secondGuideFragment);
  89. fragmentList.add(thirdGuideFragment);
  90. fragmentList.add(fourthGuideFragment);
  91. // 创建imageviews数组,大小是要显示的图片的数量
  92. imageViews = new ImageView[fragmentList.size()];
  93. int i = 0;
  94. imageViews[i++] = (ImageView) findViewById(R.id.point_1);
  95. imageViews[i++] = (ImageView) findViewById(R.id.point_2);
  96. imageViews[i++] = (ImageView) findViewById(R.id.point_3);
  97. imageViews[i++] = (ImageView) findViewById(R.id.point_4);
  98. for (int j = 0; j < imageViews.length; j++) {
  99. if (j != 0) {
  100. imageViews[j]
  101. .setBackgroundResource(R.drawable.music_zone_indicator_common);
  102. } else {
  103. imageViews[j]
  104. .setBackgroundResource(R.drawable.music_zone_indicator_current);
  105. }
  106. }
  107. tabFragmentPagerAdapter = new TabFragmentPagerAdapter(
  108. getSupportFragmentManager());
  109. viewPager.setAdapter(tabFragmentPagerAdapter);
  110. viewPager.setOnPageChangeListener(new TabOnPageChangeListener());
  111. viewPager.setCurrentItem(0);
  112. }
  113. /**
  114. *
  115. * @author Administrator Fragment滑动事件
  116. */
  117. public class TabFragmentPagerAdapter extends FragmentPagerAdapter {
  118. public TabFragmentPagerAdapter(FragmentManager fm) {
  119. super(fm);
  120. }
  121. @Override
  122. public Fragment getItem(int arg0) {
  123. return fragmentList.get(arg0);
  124. }
  125. @Override
  126. public int getCount() {
  127. return fragmentList.size();
  128. }
  129. }
  130. /**
  131. *
  132. * viewpager的监听事件
  133. *
  134. */
  135. private class TabOnPageChangeListener implements OnPageChangeListener {
  136. public void onPageScrollStateChanged(int arg0) {
  137. }
  138. public void onPageScrolled(int arg0, float arg1, int arg2) {
  139. }
  140. public void onPageSelected(int position) {
  141. // 设置导航索引
  142. for (int i = 0; i < imageViews.length; i++) {
  143. // 不是当前选中的page,其小圆点设置为未选中的状态
  144. if (position != i) {
  145. imageViews[i]
  146. .setBackgroundResource(R.drawable.music_zone_indicator_common);
  147. } else {
  148. imageViews[position]
  149. .setBackgroundResource(R.drawable.music_zone_indicator_current);
  150. }
  151. }
  152. boolean isRightToLeft = false;
  153. if (TAB_INDEX < position) {
  154. isRightToLeft = true;
  155. }
  156. TAB_INDEX = position;
  157. switch (position) {
  158. case 0:
  159. firstGuideFragment.startTitleAnimation(isRightToLeft);
  160. secondGuideFragment.stopAnimation();
  161. thirdGuideFragment.stopAnimation();
  162. fourthGuideFragment.stopAnimation();
  163. break;
  164. case 1:
  165. secondGuideFragment.startTitleAnimation(isRightToLeft);
  166. firstGuideFragment.stopAnimation();
  167. thirdGuideFragment.stopAnimation();
  168. fourthGuideFragment.stopAnimation();
  169. break;
  170. case 2:
  171. thirdGuideFragment.startTitleAnimation(isRightToLeft);
  172. firstGuideFragment.stopAnimation();
  173. secondGuideFragment.stopAnimation();
  174. fourthGuideFragment.stopAnimation();
  175. break;
  176. case 3:
  177. fourthGuideFragment.startTitleAnimation(isRightToLeft);
  178. firstGuideFragment.stopAnimation();
  179. secondGuideFragment.stopAnimation();
  180. thirdGuideFragment.stopAnimation();
  181. break;
  182. default:
  183. break;
  184. }
  185. }
  186. }
  187. @Override
  188. public boolean onKeyDown(int keyCode, KeyEvent event) {
  189. if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
  190. if ((System.currentTimeMillis() - mExitTime) > 2000) {
  191. Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
  192. mExitTime = System.currentTimeMillis();
  193. } else {
  194. ActivityManage.getInstance().exit();
  195. }
  196. return false;
  197. }
  198. return super.onKeyDown(keyCode, event);
  199. }
  200. }

复制代码

GuideActivity 的布局文件 activity_guide

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. tools:context=".GuideActivity" >
  6. <android.support.v4.view.ViewPager
  7. android:id="@+id/viewpager"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:overScrollMode="never" >
  11. </android.support.v4.view.ViewPager>
  12. <RelativeLayout
  13. android:layout_width="wrap_content"
  14. android:layout_height="50dp"
  15. android:layout_alignParentBottom="true"
  16. android:layout_centerHorizontal="true" >
  17. <ImageView
  18. android:id="@+id/point_1"
  19. android:layout_width="10dp"
  20. android:layout_height="10dp"
  21. android:layout_centerVertical="true"
  22. android:background="@drawable/music_zone_indicator_current" />
  23. <ImageView
  24. android:id="@+id/point_2"
  25. android:layout_width="10dp"
  26. android:layout_height="10dp"
  27. android:layout_centerVertical="true"
  28. android:layout_marginLeft="10dp"
  29. android:layout_toRightOf="@+id/point_1"
  30. android:background="@drawable/music_zone_indicator_common" />
  31. <ImageView
  32. android:id="@+id/point_3"
  33. android:layout_width="10dp"
  34. android:layout_height="10dp"
  35. android:layout_centerVertical="true"
  36. android:layout_marginLeft="10dp"
  37. android:layout_toRightOf="@+id/point_2"
  38. android:background="@drawable/music_zone_indicator_common" />
  39. <ImageView
  40. android:id="@+id/point_4"
  41. android:layout_width="10dp"
  42. android:layout_height="10dp"
  43. android:layout_centerVertical="true"
  44. android:layout_marginLeft="10dp"
  45. android:layout_toRightOf="@+id/point_3"
  46. android:background="@drawable/music_zone_indicator_common" />
  47. </RelativeLayout>
  48. </RelativeLayout>

复制代码

引导界面 这里用 viewpager 来实现

添加 GuideFragment 来实现界面

  1. package com.happy.fragment;
  2. import android.content.Intent;
  3. import android.graphics.Color;
  4. import android.os.AsyncTask;
  5. import android.os.Bundle;
  6. import android.os.Handler;
  7. import android.os.Message;
  8. import android.support.v4.app.Fragment;
  9. import android.view.LayoutInflater;
  10. import android.view.View;
  11. import android.view.View.OnClickListener;
  12. import android.view.ViewGroup;
  13. import android.view.animation.Animation;
  14. import android.view.animation.LinearInterpolator;
  15. import android.view.animation.TranslateAnimation;
  16. import android.widget.ImageView;
  17. import android.widget.RelativeLayout;
  18. import android.widget.TextView;
  19. import com.happy.common.Constants;
  20. import com.happy.ui.MainActivity;
  21. import com.happy.ui.R;
  22. import com.happy.util.DataUtil;
  23. public class GuideFragment extends Fragment {
  24. private View mMainView;
  25. /**
  26. * 初始化后执行动画
  27. */
  28. private boolean isInitAni = false;
  29. /**
  30. * 是否有动画
  31. */
  32. private boolean hasAni = false;
  33. /**
  34. * 背景
  35. */
  36. private RelativeLayout parentRelativeLayout;
  37. private int color = Color.rgb(163, 161, 212);
  38. /**
  39. * 主标题
  40. */
  41. private TextView mainTitleTextView;
  42. /**
  43. * 主标题内容
  44. */
  45. private String mainText;
  46. /**
  47. * 右到左标题动画
  48. */
  49. private TranslateAnimation rightToLeftTranslateAnimation;
  50. /**
  51. * 左到右标题动画
  52. */
  53. private TranslateAnimation leftToRightTranslateAnimation;
  54. /**
  55. * 副标题
  56. */
  57. private TextView secondTitleTextView;
  58. /**
  59. * 副标题内容
  60. */
  61. private String secondText;
  62. /**
  63. * 中部图片
  64. */
  65. private ImageView centPICImageView;
  66. private int centPICImage = R.drawable.guide_first_person;
  67. /**
  68. * 底部按钮图片
  69. */
  70. private ImageView goToImageView;
  71. /**
  72. * 是否可视
  73. */
  74. private boolean visibility = false;
  75. public GuideFragment() {
  76. }
  77. @Override
  78. public void onCreate(Bundle savedInstanceState) {
  79. super.onCreate(savedInstanceState);
  80. initComponent();
  81. }
  82. @Override
  83. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  84. Bundle savedInstanceState) {
  85. ViewGroup viewGroup = (ViewGroup) mMainView.getParent();
  86. if (viewGroup != null) {
  87. viewGroup.removeAllViewsInLayout();
  88. }
  89. return mMainView;
  90. }
  91. private void initComponent() {
  92. LayoutInflater inflater = getActivity().getLayoutInflater();
  93. mMainView = inflater.inflate(R.layout.fragement_guide, null, false);
  94. // 背景图片
  95. parentRelativeLayout = (RelativeLayout) mMainView
  96. .findViewById(R.id.parent);
  97. parentRelativeLayout.setBackgroundColor(color);
  98. // 主标题
  99. mainTitleTextView = (TextView) mMainView.findViewById(R.id.main_title);
  100. mainTitleTextView.setText(mainText);
  101. mainTitleTextView.setVisibility(View.INVISIBLE);
  102. // 副标题
  103. secondTitleTextView = (TextView) mMainView
  104. .findViewById(R.id.second_title);
  105. secondTitleTextView.setText(secondText);
  106. secondTitleTextView.setVisibility(View.INVISIBLE);
  107. // 中部图片
  108. centPICImageView = (ImageView) mMainView.findViewById(R.id.center_pic);
  109. centPICImageView.setBackgroundResource(centPICImage);
  110. // 跳转按钮
  111. goToImageView = (ImageView) mMainView.findViewById(R.id.goTo);
  112. if (visibility) {
  113. goToImageView.setVisibility(View.VISIBLE);
  114. } else {
  115. goToImageView.setVisibility(View.INVISIBLE);
  116. }
  117. goToImageView.setOnClickListener(new ItemOnClick());
  118. // 右到左动画
  119. rightToLeftTranslateAnimation = new TranslateAnimation(
  120. Animation.RELATIVE_TO_PARENT, +1.0f,
  121. Animation.RELATIVE_TO_PARENT, 0.0f,
  122. Animation.RELATIVE_TO_PARENT, 0.0f,
  123. Animation.RELATIVE_TO_PARENT, 0.0f);
  124. rightToLeftTranslateAnimation.setInterpolator(new LinearInterpolator());
  125. rightToLeftTranslateAnimation.setFillAfter(true);
  126. rightToLeftTranslateAnimation.setDuration(1000);
  127. // 左到右动画
  128. leftToRightTranslateAnimation = new TranslateAnimation(
  129. Animation.RELATIVE_TO_PARENT, -1.0f,
  130. Animation.RELATIVE_TO_PARENT, 0.0f,
  131. Animation.RELATIVE_TO_PARENT, 0.0f,
  132. Animation.RELATIVE_TO_PARENT, 0.0f);
  133. leftToRightTranslateAnimation.setInterpolator(new LinearInterpolator());
  134. leftToRightTranslateAnimation.setFillAfter(true);
  135. leftToRightTranslateAnimation.setDuration(1000);
  136. if (isInitAni) {
  137. startAnimation();
  138. }
  139. }
  140. /**
  141. * 开始动画
  142. */
  143. private void startAnimation() {
  144. new AsyncTask<String, Integer, String>() {
  145. @Override
  146. protected String doInBackground(String... params) {
  147. try {
  148. Thread.sleep(100);
  149. } catch (InterruptedException e) {
  150. e.printStackTrace();
  151. }
  152. startTitleAnimation(true);
  153. return null;
  154. }
  155. }.execute("");
  156. }
  157. /**
  158. * 设置背景颜色
  159. *
  160. * @param color
  161. */
  162. public void setParentRelativeLayoutColor(int color) {
  163. this.color = color;
  164. }
  165. /**
  166. * 设置底部按钮是否可视
  167. *
  168. * @param visibility
  169. */
  170. public void setGoToImageViewVisibility(boolean visibility) {
  171. this.visibility = visibility;
  172. }
  173. /**
  174. * 设置主标题内容
  175. *
  176. * @param mainText
  177. *            主标题内容
  178. */
  179. public void setMainTitleText(String mainText) {
  180. this.mainText = mainText;
  181. }
  182. /**
  183. * 设置副标题内容
  184. *
  185. * @param secondText
  186. *            副标题内容
  187. */
  188. public void setSecondTitleText(String secondText) {
  189. this.secondText = secondText;
  190. }
  191. /**
  192. * 设置中部图片
  193. *
  194. * @param centPICImage
  195. */
  196. public void setCentPICImage(int centPICImage) {
  197. this.centPICImage = centPICImage;
  198. }
  199. private Handler mHandler = new Handler() {
  200. @Override
  201. public void handleMessage(Message msg) {
  202. if (hasAni) {
  203. mainTitleTextView.clearAnimation();
  204. secondTitleTextView.clearAnimation();
  205. }
  206. boolean isRightToLeft = (Boolean) msg.obj;
  207. if (isRightToLeft) {
  208. mainTitleTextView.startAnimation(rightToLeftTranslateAnimation);
  209. secondTitleTextView
  210. .startAnimation(rightToLeftTranslateAnimation);
  211. } else {
  212. mainTitleTextView.startAnimation(leftToRightTranslateAnimation);
  213. secondTitleTextView
  214. .startAnimation(leftToRightTranslateAnimation);
  215. }
  216. hasAni = true;
  217. }
  218. };
  219. /**
  220. * 设置标题动画
  221. *
  222. * @param isRightToLeft
  223. */
  224. public void startTitleAnimation(boolean isRightToLeft) {
  225. Message msg = new Message();
  226. msg.obj = isRightToLeft;
  227. mHandler.sendMessage(msg);
  228. }
  229. /**
  230. * 设置动画
  231. *
  232. * @param isInitAni
  233. */
  234. public void setInitAni(boolean isInitAni) {
  235. this.isInitAni = isInitAni;
  236. }
  237. /**
  238. * 停止动画
  239. */
  240. public void stopAnimation() {
  241. if (mainTitleTextView != null && secondTitleTextView != null) {
  242. if (hasAni) {
  243. mainTitleTextView.clearAnimation();
  244. secondTitleTextView.clearAnimation();
  245. mainTitleTextView.setVisibility(View.INVISIBLE);
  246. secondTitleTextView.setVisibility(View.INVISIBLE);
  247. hasAni = false;
  248. }
  249. }
  250. }
  251. class ItemOnClick implements OnClickListener {
  252. @Override
  253. public void onClick(View v) {
  254. switch (v.getId()) {
  255. case R.id.goTo:
  256. goHome();
  257. break;
  258. }
  259. }
  260. /**
  261. * 跳转到主页面
  262. */
  263. private void goHome() {
  264. // 设置是否是第一次运行参数
  265. DataUtil.saveValue(getActivity(), Constants.ISFIRST_KEY, false);
  266. Intent intent = new Intent(getActivity(), MainActivity.class);
  267. startActivity(intent);
  268. // 添加界面切换效果,注意只有Android的2.0(SdkVersion版本号为5)以后的版本才支持
  269. int version = Integer.valueOf(android.os.Build.VERSION.SDK);
  270. if (version >= 5) {
  271. getActivity().overridePendingTransition(R.anim.anim_in,
  272. R.anim.anim_out);
  273. }
  274. getActivity().finish();
  275. }
  276. }
  277. }

复制代码

GuideFragment 布局文件 fragement_guide

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. tools:context=".GuideFragment" >
  7. <RelativeLayout
  8. android:id="@+id/parent"
  9. android:layout_width="fill_parent"
  10. android:layout_height="fill_parent" >
  11. <RelativeLayout
  12. android:layout_width="fill_parent"
  13. android:layout_height="fill_parent"
  14. android:layout_marginBottom="50dp" >
  15. <TextView
  16. android:id="@+id/main_title"
  17. android:layout_width="200dp"
  18. android:layout_height="wrap_content"
  19. android:layout_centerHorizontal="true"
  20. android:layout_marginBottom="5dp"
  21. android:layout_marginTop="30dp"
  22. android:gravity="center_horizontal"
  23. android:text="主标题"
  24. android:textColor="#ffffff"
  25. android:textSize="45dp" />
  26. <TextView
  27. android:id="@+id/second_title"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:layout_below="@+id/main_title"
  31. android:layout_centerHorizontal="true"
  32. android:layout_marginBottom="5dp"
  33. android:layout_marginTop="5dp"
  34. android:gravity="center_horizontal"
  35. android:text="副标题"
  36. android:textColor="#ffffff"
  37. android:textSize="30dp" />
  38. <ImageView
  39. android:id="@+id/center_pic"
  40. android:layout_width="250dp"
  41. android:layout_height="250dp"
  42. android:layout_above="@+id/goTo"
  43. android:layout_below="@+id/second_title"
  44. android:layout_centerHorizontal="true"
  45. android:layout_marginBottom="10dp"
  46. android:layout_marginTop="10dp" />
  47. <ImageView
  48. android:id="@+id/goTo"
  49. android:layout_width="wrap_content"
  50. android:layout_height="wrap_content"
  51. android:layout_alignParentBottom="true"
  52. android:layout_centerHorizontal="true"
  53. android:layout_marginBottom="5dp"
  54. android:layout_marginTop="5dp"
  55. android:background="@drawable/guide_goto"
  56. android:clickable="true" />
  57. </RelativeLayout>
  58. </RelativeLayout>
  59. </RelativeLayout>

复制代码

差点 忘记了 ActivityManage 类 处理activity

  1. package com.happy.manage;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. /**
  6. * activity的管理:退出时,遍历所有的activity,并finish,最后退出系统。
  7. *
  8. * @author Administrator 最近修改时间2013年12月10日
  9. */
  10. public class ActivityManage {
  11. /**
  12. * activity列表
  13. */
  14. private List<Activity> activityList = new LinkedList<Activity>();
  15. private static ActivityManage instance = null;
  16. private ActivityManage() {
  17. }
  18. public static ActivityManage getInstance() {
  19. if (instance == null) {
  20. instance = new ActivityManage();
  21. }
  22. return instance;
  23. }
  24. /**
  25. * 添加
  26. *
  27. * @param activity
  28. */
  29. public void addActivity(Activity activity) {
  30. activityList.add(activity);
  31. }
  32. /**
  33. * 退出
  34. */
  35. public void exit() {
  36. for (Activity activity : activityList) {
  37. if (!activity.isFinishing() && activity != null) {
  38. activity.finish();
  39. }
  40. }
  41. int id = android.os.Process.myPid();
  42. if (id != 0) {
  43. android.os.Process.killProcess(id);
  44. }
  45. }
  46. }

复制代码

时间: 2024-10-16 22:15:25

乐乐音乐播放器(三) 第一次引导页面的相关文章

乐乐音乐播放器 功能介绍(一)

该播放器主要完成的功能如下: 1.      引导页面.每个应用在启动的时候都会有一个引导页面,该引导页面的功能就是让用户可以在短时间内了解该应用的功能和相关操作. 2.      欢迎页面.应用在启动的时候都会有一个splash界面,该页面主要显示该应用的版本.名称和版权等相关信息. 3.      界面设计.一个播放器界面相对较多,主要分为:主界面.查找本地歌曲界面.歌曲列表界面.歌词界面.锁屏界面.皮肤.设置界面和播放界面等. 4.      皮肤设计.针对用户的不同喜好,提供多种皮肤.

乐乐音乐播放器 欢迎页面(二)

从开发的流程来看,引导页面应该是开发者完成相关的app所有的功能后,最后再编写的.所以现在先来写开机欢迎页面. 1. 先设置主页面 为 splash 页面. <activity android:name="com.happy.ui.SplashActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category a

如何写一个正经的Android音乐播放器 三

实现音乐的播放. 为了快速实现音乐播放,我们使用MediaPlayer而不用SoundPool,据说SoundPool比MediaPlayer的自由度更大.不过,根据我的了解,soundpool并不支持音频的解码,得自己去解码,而MeidaPlayer已经内置了一些解码方案,我看到的是,音频除了ape无损格式,都能播放. 你需要阅读: MediaPlayer API: http://developer.android.com/reference/android/media/MediaPlayer

乐乐音乐播放器(终)源代码+使用说明

使用说明: 1. 先执行app,app会在内存卡创建文件夹 haplayer/mp3 和haplayer/ksc 等文件夹.然后将projectassets 里两个文件,分别放到内存卡里 haplayer[app执行后会自己主动创建]相应的文件文件夹下,扫描歌曲,并找到那首歌词,点击播放,就能够显示歌词了. 眼下歌词文件一定要放到ksc文件夹以下且和歌词的文件名称要一样.才干够搜索到歌词. 2.主界面 主界面简单不多说. 3.主界面底部操作界面 右滑动.显示歌词 4.主界面播放列表 waterm

乐乐音乐播放器(终)源码+使用说明

使用说明: 1. 先运行app,app会在内存卡创建目录 haplayer/mp3 和haplayer/ksc 等文件夹,然后将工程assets 里两个文件,分别放到内存卡里 haplayer[app运行后会自动创建]对应的文件目录下,扫描歌曲,并找到那首歌词,点击播放,就可以显示歌词了.目前歌词文件一定要放到ksc目录下面且和歌词的文件名要一样,才可以搜索到歌词. 2.主界面 主界面简单不多说. 3.主界面底部操作界面 右滑动,显示歌词 4.主界面播放列表 5.主界面,拖动进度条,显示当前时间

Java音乐播放器-乐乐音乐(PC版)

乐乐音乐目前是基于musique开发的一个java音乐播放器,之前开发了一个android版本的音乐播放器,现在把android版本的代码移植过来PC版本这里.不过遇到了一个难题,就是java如果要播放mp3等歌曲,要安装jmf,我觉得安装这jmf真是太麻烦了,电脑是64位的伤不起啊.于是我从网上搜了一下,搜到了不少的开源播放器,如: (1)YOYOPlayer,感觉 YOYOPlayer整体上都不错,我的歌词也参考了一下它的实现,不过它在播放的时候,有一个问题,就是快进的时候,拖动条上显示的时

每天看一片代码系列(三):codepen上一个音乐播放器的实现

今天我们看的是一个使用纯HTML+CSS+JS实现音乐播放器的例子,效果还是很赞的: codePen地址 HTML部分 首先我们要思考一下,一个播放器主要包含哪些元素.首先要有播放的进度信息,还有播放/暂停或者上一首下一首等必要的按钮,同时还要显示一些当前播放的音乐名称等信息.播放多首歌曲时,要显示播放列表...因此,从语义上可以构造出基本的HTML结构: // 背景区块,用于显示当前播放音乐的图片 <div class='background' id='background'></di

Qt音乐播放器制作(三)Easy Player

今天发布了EasyPlayer的第一个版本,有兴趣的朋友可以到这里下载:基于Qt的在线音乐播放器EasyPlayer v1.0. 相对于上一篇文章,主要做了以下修改,还是先放图吧: 如图所示,爱折腾的博主又修改了界面. 最明显的变化在于去除了窗口边框,实现了自定义的最小化按钮和关闭按钮来操控窗体的相应动作. 然后,就是讲搜索列表和播放列表调换了位置,这么说来,搜索列表的右边按键要换了,改成"+"比较适合点. 最后,就是你们看到的,歌词显示界面了.第一个版本实现了歌词的同步搜索和显示,但

android调用音乐播放器,三种方

小弟想请问一下,如何在自己写的程序中调用系统的音乐播放器呢. 我在google上搜索了,主要是有两种方法,但是都不是我想要的. 第一种是,使用mp3音乐文件的uri,和intent,进行调用,但是这种是针对某一首歌曲的播放使用的. /** * 播放指定名称的歌曲 * @param audioPath 指定默认播放的音乐 */ public static void playAudio(String audioPath){ Intent mIntent = new Intent(); mIntent