Android动画效果Widget(飞行模式)
2011-08-04 11:30
417 查看
1. 功能:
创建Widget后,若为飞行模式,点击Widget,取消飞行模式,否则设置为飞行模式。在变化过程中有动画效果。
2. 实现思想:
[align=left]对应main.xml布局文件,Widget由三张图片组成,pane上层左边为airplane,右边为switch点击桌面widget时图标的时候,左边airplane四张图标动态的在切换,直到设置为飞行模式或者取消飞行模式状态完成时,airplane切换停止,同时右边switch图片切换settrings_switch_on或者settrings_switch_off。[/align]
[align=left] [/align]
3. 程序中用到图片资源文件如下:
settings_icon_airplane_01.png
settings_icon_airplane_02.png
settings_icon_airplane_03.png
settings_icon_airplane_04.png
settings_pane_off.png
settings_switch_off.png
settings_switch_on.png
widget_icon_airplane.png
创建Widget后,若为飞行模式,点击Widget,取消飞行模式,否则设置为飞行模式。在变化过程中有动画效果。
2. 实现思想:
[align=left]对应main.xml布局文件,Widget由三张图片组成,pane上层左边为airplane,右边为switch点击桌面widget时图标的时候,左边airplane四张图标动态的在切换,直到设置为飞行模式或者取消飞行模式状态完成时,airplane切换停止,同时右边switch图片切换settrings_switch_on或者settrings_switch_off。[/align]
[align=left] [/align]
3. 程序中用到图片资源文件如下:
settings_icon_airplane_01.png
settings_icon_airplane_02.png
settings_icon_airplane_03.png
settings_icon_airplane_04.png
settings_pane_off.png
settings_switch_off.png
settings_switch_on.png
widget_icon_airplane.png
code: 布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/setting_pane" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/settings_pane_off"/> <ImageView android:id="@+id/setting_airplane" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="6dip" android:src="@drawable/settings_icon_airplane_04"/> <ImageView android:id="@+id/setting_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/setting_airplane" android:layout_centerVertical="true" android:layout_marginLeft="4dip" android:src="@drawable/settings_switch_off"/> </RelativeLayout> 在res下新建xml文件夹,然后新建widget_provider.xml <?xml version="1.0" encoding="UTF-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="50dip" <-指定宽度度-> android:minHeight="50dip" <-指定高度-> android:initialLayout="@layout/main"/> 新建AirplaneModeEnabler类 public class AirplaneModeEnabler{ //此方法判断是否为飞行模式 public static boolean isAirplaneModeOn(Context context){ return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON,0)!=0; } //此方法设置或取消飞行模式,enabling参数为true,则设为飞行模式,否则取消飞行模式 public static void setAirplaneModeOn(Context context,boolean enabling){ Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, enabling?1:0); Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", enabling); context.sendBroadcast(intent); } } 建MyWidget 类,继承AppWidgetProvider,此类则widget第一次创建时执行oupdate方法, 即是广播接受者,也是广播发送者 public class MyWidget extends AppWidgetProvider { private Context mContext = null; public RemoteViews remoteViews = new RemoteViews("com.archermind.widget", R.layout.main); public final static String SET_AIRPLANE_ACTION = "com.archermind.set_airplane_mode"; private static final int START_ANIMATION = 0; //开始动画 private static final int END_ANIMATION = 1; //结束动画 private static Boolean mRunAnimation = false; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { //接受到消息后开始动画效果,即连续切换4张图片 if (msg.what == START_ANIMATION) { Log.i("state", "START_ANIMATION: mRunAnimation = " + mRunAnimation); if (!mRunAnimation) { return; } //更新widget背景图片 remoteViews.setImageViewResource(R.id.setting_airplane, mDrawable[msg.arg1]); AppWidgetManager appWidgetManger = AppWidgetManager .getInstance(mContext); int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName( mContext, MyWidget.class)); for (int id: appIds) { appWidgetManger.updateAppWidget(id, remoteViews); } // send message for next frame Message message = mHandler.obtainMessage(START_ANIMATION); message.arg1 = (msg.arg1 + 1) % 4; mHandler.sendMessageDelayed(message, 200); } else if (msg.what == END_ANIMATION) { //结束动画, Log.i("state", "END_ANIMATION: mRunAnimation = " + mRunAnimation); AppWidgetManager appWidgetManger = AppWidgetManager .getInstance(mContext); int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName( mContext, MyWidget.class)); for (int id: appIds) { updateAppWidget(mContext, appWidgetManger, id); } } Log.i("hThreadId",Long.toString(Thread.currentThread().getId())); } }; private int[] mDrawable = { R.drawable.settings_icon_airplane_01, R.drawable.settings_icon_airplane_02, R.drawable.settings_icon_airplane_03, R.drawable.settings_icon_airplane_04 }; @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); Log.i("method", "onDeleted()"); } @Override public void onDisabled(Context context) { super.onDisabled(context); Log.i("method", "onDisabled()"); } @Override public void onEnabled(Context context) { super.onEnabled(context); Log.i("method", "onEnabled()"); //创建widgt时,调用此方法,注册电话监听器 TelephonyManager telephonyManager=(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); telephonyManager.listen( mPhoneStateListener,PhoneStateListener.LISTEN_SERVICE_STATE); } //接受到发送到广播时执行此方法 @Override public void onReceive(Context context, Intent intent) { Log.i("method", "onReceive()"); super.onReceive(context, intent); Log.i("action",intent.getAction()); if(mContext ==null){ mContext = context; } if(intent.getAction().equals(SET_AIRPLANE_ACTION)){ boolean airplaneMode = AirplaneModeEnabler.isAirplaneModeOn(context); if(airplaneMode){ AirplaneModeEnabler.setAirplaneModeOn(context, !airplaneMode); }else{ AirplaneModeEnabler.setAirplaneModeOn(context, !airplaneMode); } Log.e("state", "onReceive: mRunAnimation = true"); mRunAnimation = true; Message msg = mHandler.obtainMessage(START_ANIMATION); msg.arg1 = 0; mHandler.sendMessage(msg); } } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); Log.i("method", "onUpdate()"); if(mContext==null){ mContext = context; } //创建RemoteViews,并调用updateAppWidget更新背景图片 remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); int n = appWidgetIds.length; for (int i = 0; i < n; i++) { int appWidgetId = appWidgetIds[i]; updateAppWidget(context, appWidgetManager, appWidgetId); } Log.i("length of appIds", ""+appWidgetIds.length); } //判断当前是否为飞行模式,并设置不同到背景图片 public void updateAppWidget(Context context, AppWidgetManager appWidgeManger, int appWidgetId) { boolean airplaneMode = AirplaneModeEnabler.isAirplaneModeOn(context); if(airplaneMode){ remoteViews.setImageViewResource(R.id.setting_airplane,R.drawable.settings_icon_airplane_04); remoteViews.setImageViewResource(R.id.setting_switch,R.drawable.settings_switch_on); }else{ remoteViews.setImageViewResource(R.id.setting_airplane,R.drawable.settings_icon_airplane_04); remoteViews.setImageViewResource(R.id.setting_switch,R.drawable.settings_switch_off); } //单机widget时发送广播 Intent intentClick = new Intent(SET_AIRPLANE_ACTION); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentClick, 0); remoteViews.setOnClickPendingIntent(R.id.setting_pane, pendingIntent); appWidgeManger.updateAppWidget(appWidgetId, remoteViews); } //电话监听器,用来监听是否为飞行模式 PhoneStateListener mPhoneStateListener = new PhoneStateListener(){ @Override public void onServiceStateChanged(ServiceState serviceState) { super.onServiceStateChanged(serviceState); Log.i("phThreadId",Long.toString(Thread.currentThread().getId())); switch(serviceState.getState()){ case ServiceState.STATE_IN_SERVICE: Log.i("state", "STATE_IN_SERVICE mRunAnimation = false"); mRunAnimation = false; mHandler.sendMessage(Message.obtain(mHandler, END_ANIMATION)); break; case ServiceState.STATE_POWER_OFF: Log.i("state", "STATE_POWER_OFF mRunAnimation = false"); mRunAnimation = false; mHandler.sendMessage(Message.obtain(mHandler, END_ANIMATION)); break; case ServiceState.STATE_OUT_OF_SERVICE: Log.i("state", "STATE_OUT_OF_SERVICE"); break; case ServiceState.STATE_EMERGENCY_ONLY: Log.i("state", "STATE_EMERGENCY_ONLY"); break; } } }; } <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.archermind.widget" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/widget_icon_airplane" android:label="@string/app_name"> <receiver android:name=".MyWidget" android:label="@string/app_name" android:icon="@drawable/widget_icon_airplane"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="com.archermind.set_airplane_mode" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider"/> </receiver> </application> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> </manifest>
相关文章推荐
- Android动画效果Widget(飞行模式)
- Android动画效果Widget(wifi)
- Android动画效果Widget(Bluetooth)
- Android动画效果(补间动画Tween与 帧动画Frame)
- 21种ANDROID自定义DIALOG_动画弹出对话框效果组件
- Android 动画效果(二):四种基础动画的 **动态设置、动画监听、组合动画
- android 给LinearLayout中添加一定数量的控件,并让着一定数量的控件从右到左移动,每隔若干秒停顿一下,最后一个view链接第一个view,然后继续移动循环往复,形成一个死循环简单动画效果
- Android使用ListView实现滚轮的动画效果
- android 动画效果 (转)
- Android直播app送礼物连击动画效果(实例代码)
- 【Android UI设计与开发】第03期:引导界面(三)仿微信引导界面以及动画效果
- android中xml设置Animation动画效果详解
- Android ProgressBar的动画效果
- 安卓学习笔记---Android仿美团加载数据、小人奔跑进度动画对话框(以及顺丰快递员奔跑效果)
- Android酷炫动画效果之3D星体旋转效果
- Android 模拟电视机开关机的动画效果
- Android--各类动画效果BaseAnimation
- android一个布局由消失变为可见时实现动画效果
- android实现alpha渐变动画效果
- Android——腾讯QQ的Tab按钮动画效果完美实现