展会信息港展会大全

Android菜鸟的成长笔记(25)——可爱的小闹钟
来源:互联网   发布日期:2015-09-29 10:03:02   浏览:1810次  

导读:摘要:这一篇主要使用系统为我们提供的一个服务AlarmManager来制作一个Android小闹钟,同时还涉及到了自定义主题、判断第一次启动应用、自定义动画、对话框、制作指导滑动页面等方面。...

摘要:

这一篇主要使用系统为我们提供的一个服务AlarmManager来制作一个Android小闹钟,同时还涉及到了自定义主题、判断第一次启动应用、自定义动画、对话框、制作指导滑动页面等方面。最后形成一个可以直接在手机上面使用的小闹钟。

开始启动界面AppStart.java

package com.example.alarmtest;

import android.app.Activity;

import android.content.Intent;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.content.pm.PackageManager.NameNotFoundException;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.widget.LinearLayout;

public class AppStart extends Activity{

public static final String PACKAGE_NAME = "com.example.alarmtest";

public static final String VERSION_KEY = "versionCode";

SharedPreferences preferences;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

//判断是否是首次安装

/** 判断应用首次运行 **/

preferences = getSharedPreferences("count",MODE_WORLD_READABLE);

int count = preferences.getInt("start_count", 0);

if(count == 0){

Editor editor = preferences.edit();

//存入数据

editor.putInt("start_count", ++count);

//提交修改

editor.commit();

Intent intent = new Intent(AppStart.this, GuideActivity.class);

startActivity(intent);

AppStart.this.finish();

}else{

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(

LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

LinearLayout linearLayout = new LinearLayout(this);

linearLayout.setLayoutParams(params);

linearLayout.setOrientation(LinearLayout.VERTICAL);

linearLayout.setBackgroundResource(R.drawable.main_bg_default_img_2);

new Handler().postDelayed(new Runnable(){

@Override

public void run(){

Intent intent = new Intent (AppStart.this, MainActivity.class);

startActivity(intent);

AppStart.this.finish();

}

}, 1000);

setContentView(linearLayout);

}

}

}

上面使用sharedPreference中的默认设值来判断该应用是否是第一次启动,如果是第一次启动则启动GuidActivity进入指导页面,如果不是第一次启动则启动MainActivity进入主界面。

先看看GuidActivity的实现

package com.example.alarmtest;

import java.util.ArrayList;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.os.Parcelable;

import android.support.v4.view.PagerAdapter;

import android.support.v4.view.ViewPager;

import android.support.v4.view.ViewPager.OnPageChangeListener;

import android.view.LayoutInflater;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.view.ViewGroup.LayoutParams;

import android.view.Window;

import android.view.WindowManager;

import android.widget.ImageView;

/**

* 第一次安装引导用户的Activity

* @author lixq

*

*/

public class GuideActivity extends Activity{

private ViewPager viewPager;

private ArrayList pageViews;

private ImageView imageView;

private ImageView[] imageViews;

// 包裹滑动图片LinearLayout

private ViewGroup main;

// 包裹小圆点的LinearLayout

private ViewGroup group;

//左箭头按钮

private ImageView imageViewLeft;

//右箭头按钮

private ImageView imageViewRight;

//当前页码

private int currentIndex;

//ImageView的alpha值

private int mAlpha = 0;

private boolean isHide;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//将要显示的图片放到ArrayList当中,存到适配器中

LayoutInflater inflater = getLayoutInflater();

pageViews = new ArrayList();

pageViews.add(inflater.inflate(R.layout.guide_item1, null));

pageViews.add(inflater.inflate(R.layout.guide_item2, null));

pageViews.add(inflater.inflate(R.layout.guide_item3, null));

pageViews.add(inflater.inflate(R.layout.guide_item4, null));

//将图片存放到ImageView集合中

imageViews = new ImageView[pageViews.size()];

main = (ViewGroup)inflater.inflate(R.layout.guide, null);

//获取存放底部导航点ViewGroup

group = (ViewGroup)main.findViewById(R.id.guide_point_ll);

viewPager = (ViewPager)main.findViewById(R.id.guide_viewpager);

imageViewLeft = (ImageView)main.findViewById(R.id.imageView1);

imageViewRight = (ImageView)main.findViewById(R.id.imageView2);

imageViewLeft.setAlpha(0);

imageViewRight.setAlpha(0);

//将小圆点放到imageView数组当中

for (int i = 0; i 255)

mAlpha=255;

imageViewLeft.setAlpha(mAlpha);

imageViewLeft.invalidate();

imageViewRight.setAlpha(mAlpha);

imageViewRight.invalidate();

if(!isHide && mAlpha0){

mAlpha -= 3;

if(mAlpha0)

mHandler.sendEmptyMessageDelayed(0, 2);

}

}

};

private void showImageButtonView(){

isHide = false;

mHandler.sendEmptyMessage(1);

}

private void hideImageButtonView(){

new Thread(){

public void run() {

try {

isHide = true;

mHandler.sendEmptyMessage(0);

} catch (Exception e) {

;

}

}

}.start();

}

@Override

public boolean dispatchTouchEvent(MotionEvent ev) {

System.out.println("this is dispatch");

System.out.println("触碰屏幕");

switch (ev.getAction()) {

case MotionEvent.ACTION_MOVE:

case MotionEvent.ACTION_DOWN:

showImageButtonView();

break;

case MotionEvent.ACTION_UP:

hideImageButtonView();

break;

}

return super.dispatchTouchEvent(ev);

}

// 指引页面数据适配器,实现适配器方法

class GuidePageAdapter extends PagerAdapter {

@Override

public int getCount() {

return pageViews.size();

}

@Override

public boolean isViewFromObject(View arg0, Object arg1) {

return arg0 == arg1;

}

@Override

public int getItemPosition(Object object) {

// TODO Auto-generated method stub

return super.getItemPosition(object);

}

@Override

public void destroyItem(View arg0, int arg1, Object arg2) {

// TODO Auto-generated method stub

((ViewPager) arg0).removeView(pageViews.get(arg1));

}

@Override

public Object instantiateItem(View arg0, int arg1) {

// TODO Auto-generated method stub

((ViewPager) arg0).addView(pageViews.get(arg1));

return pageViews.get(arg1);

}

@Override

public void restoreState(Parcelable arg0, ClassLoader arg1) {

// TODO Auto-generated method stub

}

@Override

public Parcelable saveState() {

// TODO Auto-generated method stub

return null;

}

@Override

public void startUpdate(View arg0) {

// TODO Auto-generated method stub

}

@Override

public void finishUpdate(View arg0) {

// TODO Auto-generated method stub

}

}

// 指引页面更改事件监听器,左右滑动图片时候,小圆点变换显示当前图片位置

class GuidePageChangeListener implements OnPageChangeListener {

@Override

public void onPageScrollStateChanged(int arg0) {

// TODO Auto-generated method stub

}

@Override

public void onPageScrolled(int arg0, float arg1, int arg2) {

// TODO Auto-generated method stub

}

@Override

public void onPageSelected(int arg0) {

currentIndex = arg0;

for (int i = 0; i 使用ViewPage来显示各个布局文件,在四个布局文件中分别放四张图片。

详情请看:http://blog.csdn.net/dawanganban/article/details/17305769

进入主界面后就是我们设置闹钟的界面了,实现如下:

package com.example.alarmtest;

import java.util.Calendar;

import android.app.Activity;

import android.app.AlarmManager;

import android.app.PendingIntent;

import android.app.Service;

import android.app.TimePickerDialog;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TimePicker;

import android.widget.Toast;

public class MainActivity extends Activity {

Button button;

AlarmManager alarmManager;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button = (Button) findViewById(R.id.button1);

//获取AlarmManager对象

alarmManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

Calendar currentTime = Calendar.getInstance();

//创建一个TimePickerDialog实例,并显示

new TimePickerDialog(MainActivity.this, 0,

new TimePickerDialog.OnTimeSetListener() {

@Override

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

//指定启动AlarmActivity组件

Intent intent = new Intent(MainActivity.this, AlarmActivity.class);

//创建PendingIntent对象

/*

* PendingIntent与Intent的区别是PendingIntent处理即将发生的事情

* 比如:在通知栏Notification中跳转页面,不是立即跳转

* 通常通过getActivity、getBroadcast、getService得到PendingIntent的实例

*

*/

PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);

Calendar c = Calendar.getInstance();

c.setTimeInMillis(System.currentTimeMillis());

c.set(Calendar.HOUR, hourOfDay);

c.set(Calendar.MINUTE, minute);

alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);

Toast.makeText(MainActivity.this, "设置闹钟成功", Toast.LENGTH_SHORT).show();

}

}, currentTime.get(Calendar.HOUR_OF_DAY), currentTime.get(Calendar.MINUTE), false).show();

}

});

}

}

上面使用了一个时间设置组件TimePickDialog来设置时间,设置完时间后使用AlarmManager的set方法设置闹钟,值得注意的是上面有一个PendingIntent,这个和Intent的区别是PendIntent表示即将发生的意图,常和AlarmManager与Notifycation同时使用。另外,AlarmManager.RTC_WAKEUP表示一个定时器且会发出警报。

闹钟到时间后启动AlarmActivity来播放音乐

package com.example.alarmtest;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.Notification;

import android.content.DialogInterface;

import android.content.DialogInterface.OnClickListener;

import android.media.MediaPlayer;

import android.os.Bundle;

public class AlarmActivity extends Activity{

MediaPlayer alarmMusic;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//加载指定音乐,并为之创建MediaPlayer对象

alarmMusic = MediaPlayer.create(this, R.raw.nswdy);

alarmMusic.setLooping(true);

//播放闹钟

alarmMusic.start();

//创建一个对话框

new AlertDialog.Builder(AlarmActivity.this).setTitle("闹钟")

.setMessage("闹钟响了,快起床啦!")

.setPositiveButton("确定", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

//停止音乐

alarmMusic.stop();

AlarmActivity.this.finish();

}

}).show();

}

}

最后的运行结果:

赞助本站

人工智能实验室

相关热词: android开发 教程

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港