Android——悬浮窗+侧边弹框+淡入淡出+背景shape+SeekBar调节手机亮度


悬浮窗实现原理:

 悬浮窗要实现,需要用到几个关键的类。

 WindowManager:声明了 addView() 、updateViewLayout()、removeView()三个方法的接口

    要创建出悬浮窗:那就得使用addView(布局对象,布局参数)方法

    要更新悬浮窗的数据,如实现拖动悬浮框:那就得使用updateViewLayout(View,LayoutParams)方法

            通常拖拽是写在布局类的onTouchEvent中的,所以这里通常传入的是updateViewLayout(this,mParams)

            通常悬浮窗显示的数据是要实时更新的,如手机内存情况:可以通过服务开启timer定时执行

    要移除悬浮窗:可以使用removeView(布局对象)方法

而WindowManager是一个接口,所以自然需要去找它的实现类

WindowManagerImpl:是WindowManager一个重要的实现类,它主要用于保存每个图层的数据——View[],ViewRoot[],WindowManager.LayoutParams[]

    但具体操作悬浮窗时不直接使用它,而是使用它的一个内部类

WindowManagerImpl.CompatModeWrapper:实现了WindowManager接口的WindowManagerImpl内部类,用它来实现悬浮窗的操作

    特别之处在,它是不依赖Activity存活的!!所以通过服务和CompatModeWrapper就可以实现悬浮窗!!

    而创建的悬浮窗与Home的交互属性,记录在WindowManager.LayoutParams即可,调用addView(布局,WindowManager.LayoutParams)即可!!

Window.LocalWindowManager:隶属于Activity的窗口管理器,它依然是实现了WindowManger接口,在每个ActivityThread创建一个Activity的时候,都会有一个对应的LocalWindowManger

了解了这些之后,实现悬浮窗就不难了,麻烦点在于:

    悬浮窗的必要参数(照抄即可),如mParams.type = WindowManager.LayoutParams.TYPE_PHONE表示悬浮窗在Activity上层,在状态栏下层!

    拖拽的实现:主要是要考虑需要的参数,以左上角为起点计算等

    判断当前是否是桌面:通常需要判断当前是桌面还是其他activity在运行,如果是其他activity在运行的话,就应当将悬浮窗关闭,当是桌面的时候再开启

参考两篇博客:

 http://blog.csdn.net/guolin_blog/article/details/8689140

 http://blog.csdn.net/stevenhu_223/article/details/8504058

侧边弹框+淡入淡出效果实现:

 靠PopupWindow的setAnimationStyle(动画资源)方法设置动画效果

 所以:

在res下新建anim目录,将动画的配置文件给定义好

 1 <?xml version="1.0" encoding="utf-8"?>
 2 
 3 
 4     
 5     <translate
 6         android:duration="3000"
 7         android:fromYDelta="100%"
 8         android:toYDelta="0" />
 9 
10     
11     <alpha
12         android:duration="3000"
13         android:fromAlpha="0.0"
14         android:toAlpha="1.0" />
15 
16 
弹出和淡入效果

在values目录styles.xml中定义动画样式

1       
2     

所以,seekbar_horizontal自然是定义在drawable中的xml文件

 1 
 2 <?xml version="1.0" encoding="utf-8"?>
 3 list  
 4   xmlns:android="http://schemas.android.com/apk/res/android">  
 5       
 6       
 7           
 8               
 9                   
10                   
11               
12           
13       
14       
15           
16       
17   

使用:在布局中像Button控件一样使用,设置进度的最大值,设置样式。

 1         <SeekBar
 2             android:id="@+id/seekBar1"
 3             android:layout_width="match_parent"
 4             android:layout_height="wrap_content"
 5             android:max="235"
 6             style="@style/Widget.SeekBar.Normal"
 7             android:layout_gravity="center_vertical"
 8             android:layout_marginLeft="16dp"
 9             android:layout_marginRight="16dp"
10             android:layout_weight="1" />

参考博客:

http://blog.csdn.net/liangguo03/article/details/7048793

http://blog.csdn.net/brokge/article/details/9713041

调节系统亮度的实现:

 只需要传入Activity和需要的亮度值就可以调整系统亮度了!!所以,如果再监听到seekbar的值(0-235),再加上Android默认的最小值20,就可以正确的调整系统亮度了!!

 当然,这里没必要用public静态方法,具体优化细心总结

 1     /**
 2      * 设置屏幕亮度
 3      * @param activity
 4      * @param brightness 需要调整到的亮度,传入
 5      * @throws SettingNotFoundException 
 6      */
 7     public static void setScreenBrightness(Activity activity, int brightness) throws SettingNotFoundException {
 8         WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
 9         lp.screenBrightness = brightness / 255.0f; //  固定计算
10         activity.getWindow().setAttributes(lp);
11         Settings.System.putInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightness);
12         activity.getContentResolver().notifyChange(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), null);
13     }

 参考博客:http://blog.csdn.net/zhuangxujun/article/details/8601392

 参考问题:http://ask.csdn.net/questions/310

源码在此