Archive for the ‘Android开发’ Category.

Android Dialog弹出时不显示导航栏(沉浸式)

我们的app是全屏沉浸式的,发现activity在设置了全屏后,弹出dialog底部会跳出导航栏虚拟键。具体原因是因为Dialog的Window抢走了焦点,Window 中的 DecorView 状态改变导致了退出。
解决方法,在Dialog中:

   private void fullScreenImmersive(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_FULLSCREEN;
            view.setSystemUiVisibility(uiOptions);
        }
    }

    @Override
    public void show() {
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
        super.show();
        fullScreenImmersive(getWindow().getDecorView());
        this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    }

使用ConstraintLayout(约束布局)构建响应式UI

ConstraintLayout(约束布局)是Google IO 2016推出的Android新布局方式。

以下内容翻自官方文档。

ConstraintLayout允许您使用扁平的层级(不用嵌套View Group)创建大型复杂的布局。与RelativeLayout类似,它通过相邻的view和父layout的相对关系来确定位置,但比RelativeLayout更加灵活,更容易通过Android Studio的布局编辑器实现想要的效果。

Continue reading “使用ConstraintLayout(约束布局)构建响应式UI” »

Android开发:Parcelable和Serializable序列化的区别

Android在Intent,Bundle传递数据时,都需要对象对应的类实现Parcelable或Serializable接口,即序列化。都是序列化,这两者有什么区别呢?
Serializable是Java定义的序列化接口,底层用反射实现,使用时io开销比较大,适用于将对象存储到文件或网络传输。
而Parcelable是Android定义的接口,使用起来相对复杂些,需要写一堆的方法(同是避免了使用反射),不过,在AndroidStudio里,可以用一个叫Android Parcelable code generator的小插件快速生成代码。
Parcelable的优势在于,效率高,在内存中传输时,建议使用Parcelable。有评测显示Parcelable性能比Serializable高十倍以上。

Android开发:LayerDrawable setBounds无效解决方法

设计效果是这样的:
circle
两个圆,底下是蓝色,上面的是白色,用LayerDrawable做,两个ShapeDrawable最合适不过,因为要动态改白圆的大小,所以直接写在xml里就不太合适,用Java代码写.
但是发现在白色的ShapeDrawable上setBounds没有缩进的效果,直接把下面的蓝圆盖掉了。其实这里应该用LayerDrawable的setLayerInset方法:

        OvalShape shape1 = new OvalShape();
        ShapeDrawable drawable1 = new ShapeDrawable(shape1);
        drawable1.getPaint().setColor(colorBlue);
        Drawable[] drawables = new Drawable[2];
        drawables[0] = drawable1;
        OvalShape shape2 = new OvalShape();
        ShapeDrawable drawable2 = new ShapeDrawable(shape2);
        //下面一行无效
//        drawable2.setBounds(10,10,10,10);
        drawable2.getPaint().setColor(Color.WHITE);
        drawables[1] = drawable2;
        LayerDrawable layerDrawable = new LayerDrawable(drawables);
        //需要使用setLayerInset,第一个参数是drawable索引,后面是左上右下
        layerDrawable.setLayerInset(1, 10,10,10,10);
        ViewHelper.setBackgroundForView(viewCircle,layerDrawable);

iTerm 终端 设置 代理(http,socks5)

某些站点必须爬墙才能访问,但在mac上设置的全局代理,对终端又不起作用,终端需要单独设置代理。
在终端中执行:

export http_proxy=socks5://127.0.0.1:1080
export https_proxy=socks5://127.0.0.1:1080

如果是http的代理:

export http_proxy=http://127.0.0.1:1080/
export https_proxy=http://127.0.0.1:1080/

如果需要开机自动设置,把上面的代码加到~/.bash_profile里

百度地图3.5.0和导航2.0 sdk同时使用时,地图不显示bug解决

所有SDK是从http://lbsyun.baidu.com/sdk/download?selected=navifunctionwithtts页面一次下载的,不应该存在兼容性问题。
我的地图和导航都在同一个Activity里,使用Fragment展示,初始化导航(BaiduNaviManager.getInstance().init)在Activity的onCreate方法里执行,会在MapFragment展示前执行.问题来了,在某些机器上,MapFragment竟然显示网格或空白,而注释掉初始化导航代码后,一切正常。
在这里不得不吐槽一下百度的sdk,使用文档就一页,几乎等于没写。官方demo,我选了多个sdk,下载下来的是各个sdk独立的,定位,导航,地图都是不同的demo,打了个包而已,导航sdk demo,也没有释放资源,uninit,某些sdk竟然还不是最新的.现在遇到的这个问题显然是bug。
折腾了大半天,最后发现初始化导航动作必须在地图第一次展示后执行,问题解决。原先用的是1.0.0版本的导航,但在某些设备上会crash,为了解决这个问题不得不升级,后面不知道还有多少坑。

Android开发:View内容生成图片

生成图片的操作比较耗时,虽然是View对象,但咱是直接把View对象转成图片,不涉及修改UI显示,可以异步处理。

contentLayout.setDrawingCacheEnabled(true);     
contentLayout.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),     
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));     
contentLayout.layout(0, 0, contentLayout.getMeasuredWidth(),     
                contentLayout.getMeasuredHeight());     
contentLayout.buildDrawingCache();     
Bitmap bitmap= contentLayout.getDrawingCache();    

Android开发:仿余额宝数字金额跳动的TextView

余额宝的金额在显示时是会跳动的,而且改变的速度是不一样的。下面自定义一个这种效果的View. Continue reading “Android开发:仿余额宝数字金额跳动的TextView” »