加到油窗显示多少位置,andriod屏幕圆角实现方法

2019-10-05 00:52 来源:未知

喷浆开机在此以前必须往箱体内齿轮加油,加到油窗突显多少地方?答:加到油窗呈现58%职位。

今日无尽完美屏手提式有线电话机的显示器四角做成圆的,其圆润的感到到给人带来任何的视觉体验。先来一张本人民代表大会锤子镇楼(不是广告啊,锤子没给钱),我们来直观感受一下圆角的魅力。

锤子.png

当然这种是硬件上贯彻的,小编匪夷所思也是方的显示器,然后做了个圆角隐讳。那对于我们那个脸方的手机,就不可能笑嘻嘻的圆三遍呢?答案是必定的,no picture say ...

效果图

(应该能看出来自己用的是神马手提式无线电话机吧)

圆角贯彻:

这大家就应当思量了,软件层面如何实现这种效果与利益呢。相信广大对象立马会想到——使用悬浮窗。

兑现原理:利用WindowManager将我们的圆角加到显示屏的四个角,圆角颜色设置为黑色,变成视觉圆角显示屏。

1.自定义圆角view

很显著,首先大家须求贯彻三个模样如下图的圆角,如何是好吗?用path(素不相识的伙伴能够百度时而哈),这里大家以左上角为例达成这一个圆角。

圆角

            // top left
            case Gravity.TOP | Gravity.LEFT:
                path.moveTo(0.0f, 0.0f);
                path.lineTo(0.0f, (float) h);
                path.arcTo(new RectF(0.0f, 0.0f,
                        ((float) w) * 2.0f, ((float) h) * 2.0f), 180.0f, 90.0f, true);
                path.lineTo((float) w, 0.0f);
                path.lineTo(0.0f, 0.0f);
                path.close();
                break;

为了能让客户自定义圆角颜色,大小,折射率,各类角是或不是出示,我在里头加了相应的调节变量,当客商设置的时候更新view就足以了。

    public void setCornerSize(int size){
        this.cornerSize = size;
        requestLayout();
        invalidate();
    }

是还是不是很轻巧,那样二个圆角view就兑现了。

2.呈现圆角

最近我们就要在显示器的八个角将圆角加上去了。这里运用了android的悬浮窗技巧。即用windowmanager将大家的圆角加到顶层的window上,掩瞒别的部分。windowmanager在抬高view的时候须求设置两个WindowManager.LayoutParams。下边大家初步化那个Params:

       // window manager
       manager = (WindowManager) this.getApplicationContext()
                .getSystemService(Context.WINDOW_SERVICE);

       params = new WindowManager.LayoutParams();
        /*
         系统提示类型:7.0以前可以直接用TOAST的类型,不用申请权限,直接添加
         7.0以后不行了,需要申请SYSTEM_ALERT_WINDOW权限,window type最好
         设置为ERROR 或者 PHONE
         */
        if (Utilities.isCanUseToastType()) {
            params.type = WindowManager.LayoutParams.TYPE_TOAST;
        } else {
            params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
        }
        params.format = 1;
        params.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN // 全屏
                | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS // 覆盖到status bar
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION // 覆盖到导航栏

                // 以下属性设置加载我们圆角window 不抢焦点,不拦截事件
                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        params.alpha = 1.0f;
        params.x = 0;
        params.y = 0;
        // 设置  大小为全屏
        params.width = ViewUtil.getScreenSize(this).x;
        params.height = ViewUtil.getScreenSize(this).y;

表明写的可比详细,不晓得的自动百度哈。
随即大家要求把圆角加到显示屏上:

    public void addCornerViewByPosition(String position){
        boolean enable = true;
        switch (position) {
            case LEFT_TOP:
                enable = leftTopEnable;
                params.gravity = Gravity.TOP | Gravity.LEFT;
                break;
            case RIGHT_TOP:
                enable = rightTopEnable;
                params.gravity = Gravity.TOP | Gravity.RIGHT;
                break;
            case LEFT_BOTTOM:
                enable = leftBottomEnable;
                params.gravity = Gravity.BOTTOM | Gravity.LEFT;
                break;
            case RIGHT_BOTTOM:
                enable = rightBottomEnable;
                params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
                break;
        }
        CornerView corner = buildCorner(enable,params.gravity);
        if(!corners.containsValue(corner)) {
            corners.put(position, corner);
            manager.addView(corner, params);
        }
    }

如上代码是依附种种地方是还是不是能显得将大家的corner加到荧屏上,在那之中buildCorner是依据客户自定义的安装创制cornerview

    private CornerView buildCorner(boolean enable,int position){
        CornerView corner = new CornerView(this);
        corner.setColor(currentColor);
        corner.setCornerOpacity(currentOpacity);
        corner.setCornerSize(currentCornerSize);
        corner.setLocation(position);
        if(enable){
            corner.show();
        } else {
            corner.hide();
        }
        return corner;
    }

从那之后,我们的圆角就显获得显示器上了(击手)。

圆角保活:

率先大家为了让圆角能够短期存在于显示器上,作者把其操作(增多,删除,自定义)放到了五个service,不过瑟维斯也很轻便被杀,这里大家就有必不可大将军活了。
android中的保活方案有众多,比方利用ServicestartForeground,双历程,叁个像素的Activity,接收系统广播运行服务,使用JobSheduler,沙漏等等。
推荐介绍看一下那篇:http://blog.csdn.net/u013263323/article/details/56285475。
此间作者使用了第一种方案,即当客商选则保活时,使用ServicestartForeground发出一条通告,最大程度的承接保险大家的Service不被杀掉。代码相比简单,就不贴了。

有些小细节:

我在测量检验的时候发掘,强制结束应用服务后,再度踏入应用,当我们想去掉圆角时却一味去不掉,那么些难题在一些购买发售利用上也存在。那一个是因为本人大家事先增进的view未有移除掉,重新开启使用的时候又加了一层。所以大家要在destroy以前把大家的view移除掉,然后功用就平时了。
同期正是权力的申请难点,大家在加悬浮窗的时候要检查实验是还是不是有权力,代码如下

 public static boolean checkFloatWindowPermission(Context context) {
        final int version = Build.VERSION.SDK_INT;
        if (version >= 19) {
            return checkOp(context, 24); //OP_SYSTEM_ALERT_WINDOW = 24;
        }
        return true;
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    private static boolean checkOp(Context context, int op) {
        final int version = Build.VERSION.SDK_INT;
        if (version >= 19) {
            AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
            try {
                Class clazz = AppOpsManager.class;
                Method method = clazz.getDeclaredMethod("checkOp", int.class, int.class, String.class);
                return AppOpsManager.MODE_ALLOWED == (int)method.invoke(manager, op, Binder.getCallingUid(), context.getPackageName());
            } catch (Exception e) {
                Log.e("", Log.getStackTraceString(e));
            }
        } else {
            Log.e("Utilities", "Below API 19 cannot invoke!");
        }
        return false;
    }

那边运用了反光,也多谢互连网海南大学学神的减轻方案。

小结:

先是次写博客,比较面生,很荒唐的地方希望大家谅解和指正(笔者早就筹划好接待大家的吐沫了)。
但愿联手念书,一同前行
本条是本人的花色地址,须要的话大家能够看一下:
https://github.com/zibuyuqing/RoundCorner
最后附上app截图,庆祝一下

效果图

TAG标签:
版权声明:本文由永利电子游戏网址发布于关于企业,转载请注明出处:加到油窗显示多少位置,andriod屏幕圆角实现方法