原标题:旗舰级交互体验 一句话Bixby帮你消除一切

前言

规划图给出的效能

19463331伟德国际手机版 1

末尾的功效

19463331伟德国际手机版 2

最后代码
common_tv_right_more 的点击事件

    if (view.getId() == R.id.common_tv_right_more) { 
        new PopTop.Builder(this)
                .setView(findViewById(R.id.common_tv_right_more)) // 在某个空间的下面 
                .setPopTopOnClick(new PopTop.PopTopOnClick() {
                    @Override
                    public void EditOnclick() {
                        /* 编辑 监听*/ 
                    } 
                    @Override
                    public void DelOnclick() {
                        /*删除 监听*/
                    } 
                })
                .show();
    }

随着起始想和上学如何是好了。

在人工智能越来越强盛的后天,手提式有线电话机智能语音帮手得以说是大家体验AI最棒的法子了,而这在那之中表现最好的要属厚积薄发的Bixby。Samsung的Bixby最早在Galaxy
S八和Note八身上搭载,而在今年一月份流行透露的三星(Samsung)Galaxy A玖Star中,Samsung也将这一手艺下放,现在299九元的价格上,大家也能体验到旗舰级的智能助手。

应用情状

PopupWindow,顾名思义,便是弹窗,在无数气象下都足以看看它。例如ActionBar/Toolbar的选项弹窗,一组选项的器皿,恐怕列表等联谊的窗口等等。

19463331伟德国际手机版 3

主干采纳

选拔PopupWindow极粗略,可以计算为四个步骤:

一、创设PopupWindow对象实例;

贰、设置背景、注册事件监听器和增添卡通;

3、显示PopupWindow。

// 用于PopupWindow的View
View contentView=LayoutInflater.from(context).inflate(layoutRes, null, false);
// 创建PopupWindow对象,其中:
// 第一个参数是用于PopupWindow中的View,第二个参数是PopupWindow的宽度,
// 第三个参数是PopupWindow的高度,第四个参数指定PopupWindow能否获得焦点
PopupWindow window=new PopupWindow(contentView, 100, 100, true);
// 设置PopupWindow的背景
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
// 设置PopupWindow是否能响应外部点击事件
window.setOutsideTouchable(true);
// 设置PopupWindow是否能响应点击事件
window.setTouchable(true);
// 显示PopupWindow,其中:
// 第一个参数是PopupWindow的锚点,第二和第三个参数分别是PopupWindow相对锚点的x、y偏移
window.showAsDropDown(anchor, xoff, yoff);
// 或者也可以调用此方法显示PopupWindow,其中:
// 第一个参数是PopupWindow的父View,第二个参数是PopupWindow相对父View的位置,
// 第三和第四个参数分别是PopupWindow相对父View的x、y偏移
// window.showAtLocation(parent, gravity, x, y);

SamsungGalaxy A九Star和旗舰机一样,在机身右侧也有为Bixby设置的独立按钮,只供给按住Bixby键恐怕直接用语音就能够呼出Bixby。那颗按钮,不仅仅能够呼出Bixby,还有众多其余隐蔽的功效点,例如上午机械钟响起后,按那么些键能够自动延后陆分钟,让您睡个小懒觉。

动用showAsDropDown方法呈现PopupWindow

万般状态下,调用showAsDropDown方法后PopupWindow将会在锚点的左下方呈现(drop
down)。可是,有时想让PopupWindow在锚点的顶端展现,或然在锚点的中档地点展现,此时就需求用到showAsDropDown方法的xoff和yoff参数了。

那边大家的目标不仅仅囊括地点提到的三种状态(锚点上方或锚点中部),而是席卷了档次和垂直方向各伍种显示格局:

  1. 水平方向:
    • ALIGN_LEFT:在锚点内部的左边;
    • ALIGN_SportageIGHT:在锚点内部的右侧;
    • CENTER_HO智跑I:在锚点水平居中;
    • TO_途锐IGHT:在锚点外部的右手;
    • TO_LEFT:在锚点外部的左边。

  1. 垂直方向:
    • ALIGN_ABOVE:在锚点内部的上边;
    • ALIGN_BOTTOM:在锚点内部的下方;
    • CENTER_VERT:在锚点垂直中部;
    • TO_BOTTOM:在锚点外部的下方;
    • TO_ABOVE:在锚点外部的上边。

上面来看张图:

19463331伟德国际手机版 4

19463331伟德国际手机版 5

19463331伟德国际手机版 6

showAsDropDown 能够做什么样职能

19463331伟德国际手机版 7

19463331伟德国际手机版 8

19463331伟德国际手机版 9

19463331伟德国际手机版 10

19463331伟德国际手机版 11

19463331伟德国际手机版 12

19463331伟德国际手机版 13

想要的效用 是在某个控件的上边 并且还要有偏移 角度,所以在偏移角度上
大意是多少再去调节。
据此在根本的措施落在了showAsDropDown 的底下。
想要写成通用的也不是不得以的,先不要想那样多,先去做,完成如今的效率再说。

由地方的着力方式中本人能够见到
View contentView=LayoutInflater.from(context).inflate(layoutRes, null,
false);

本条view 的面世,所以就足以把它独立拿起来,在单独页面二月xml
处理,底色背景和角度了,
以及任何view
中的点击事件处理,并且展现不那么啰嗦了,看轻易的代码,就用到build设计格局,
优秀了那么些方式的亮点,不断加多 种种设置标准。

build设计格局

自身从前也写过有关设计形式的标题。

先是看是build 的时候创造view 可能说产出view 为了提供呈现用

public PopTop(Builder builder) {
    //窗口布局
    super(builder.context);
    this.builder = builder;
    Create();
}

public void Create() {
    //窗口布局
    setContentView(mainView = LayoutInflater.from(builder.context).inflate(R.layout.pop_top, null));
    //设置宽度
    setWidth(dip2px(builder.context, 100));
    //设置高度
    setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
    setTouchable(true);
    setFocusable(true);
    //设置显示隐藏动画
    //        setAnimationStyle(R.style.AnimTools);
    //设置背景透明
    setBackgroundDrawable(new ColorDrawable());
    /*          //监听窗口的焦点事件,点击窗口外面则取消显示*/
    getContentView().setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                dismiss();
            }
        }
    });
    //初始化 控件点击事件处理
    initView(mainView);
}

再看build 做了何等处理

public static class Builder {
    protected final Context context;
    protected View view; 

    PopTopOnClick popTopOnClick;

    public Builder setPopTopOnClick(PopTopOnClick popTopOnClick) {
        this.popTopOnClick = popTopOnClick;
        return this;
    } 

    public Builder setView(View view) {
        this.view = view;
        return this;
    }

    public Builder(@NonNull Context context) {
        this.context = context;
    }

    @UiThread
    public PopupWindow build() {
        return new PopTop(this);
    }

    @UiThread
    public PopupWindow show() {
        PopupWindow popTop = build();
        int windowPos[] = calculatePopWindowPos(view);
        windowPos[0] -= 15; //x 轴向左偏移15像素
        windowPos[1] -= 10; //y 轴向上偏移10像素
        popTop.showAtLocation(view, Gravity.TOP | Gravity.START, windowPos[0], windowPos[1]);
        return popTop;
    }
}

主要在show 中

对偏移量的拍卖,并且在适当的地方处理,在上面基本中研究。

/**
 * 计算出来的位置,y方向就在anchorView的上面和下面对齐显示,x方向就是与屏幕右边对齐显示
 * 如果anchorView的位置有变化,就可以适当自己额外加入偏移来修正
 *
 * @param anchorView 呼出window的view
 * @return window显示的左上角的xOff, yOff坐标
 */
public static int[] calculatePopWindowPos(final View anchorView) {

    final int windowPos[] = new int[2];
    final int anchorLoc[] = new int[2];
    // 获取锚点View在屏幕上的左上角坐标位置
    anchorView.getLocationOnScreen(anchorLoc);
    final int anchorHeight = anchorView.getHeight();
    // 获取屏幕的高宽
    final int screenHeight = getScreenHeight(anchorView.getContext());
    final int screenWidth = getScreenWidth(anchorView.getContext());
    mainView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    // 计算contentView的高宽
    final int windowHeight = mainView.getMeasuredHeight();
    final int windowWidth = mainView.getMeasuredWidth();
    // 判断需要向上弹出还是向下弹出显示
    final boolean isNeedShowUp = (screenHeight - anchorLoc[1] - anchorHeight < windowHeight);
    if (isNeedShowUp) {
        windowPos[0] = screenWidth - windowWidth;
        windowPos[1] = anchorLoc[1] - windowHeight;
    } else {
        windowPos[0] = screenWidth - windowWidth;
        windowPos[1] = anchorLoc[1] + anchorHeight;
    }
    return windowPos;
}

大致流程就是那个了,至于点击事件,举办事件监听,也是从发生的pop的时候传递过来的。

不无代码

import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.support.annotation.NonNull;
import android.support.annotation.UiThread;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;



public class PopTop extends PopupWindow implements View.OnClickListener {

    public static View mainView;
    protected final Builder builder;
    protected TextView popTvCustomerEdit;
    protected TextView popTvCustomerDel;
    protected LinearLayout popLlEdit;
    protected TextView popTvCustomerSys;
    protected TextView popTvCustomerCreate;
    protected LinearLayout popLlCustomer;

    public PopTop(Builder builder) {
        //窗口布局
        super(builder.context);
        this.builder = builder;
        Create();
    }

    public void Create() {
        //窗口布局
        setContentView(mainView = LayoutInflater.from(builder.context).inflate(R.layout.pop_top, null));
        //设置宽度
        setWidth(dip2px(builder.context, 100));
        //设置高度
        setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
        setTouchable(true);
        setFocusable(true);
        //设置显示隐藏动画
//        setAnimationStyle(R.style.AnimTools);
        //设置背景透明
        setBackgroundDrawable(new ColorDrawable());
        /*          //监听窗口的焦点事件,点击窗口外面则取消显示*/
        getContentView().setOnFocusChangeListener(new View.OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    dismiss();
                }
            }
        });
        initView(mainView);
    }

    @Override
    public void onClick(View view) {
        dismiss();
        if (view.getId() == R.id.pop_tv_customer_edit) {
            if(builder.popTopOnClick != null){
                builder.popTopOnClick.EditOnclick();
            }
        } else if (view.getId() == R.id.pop_tv_customer_del) {
            if(builder.popTopOnClick != null){
                builder.popTopOnClick.hashCode();
            }
        } else if (view.getId() == R.id.pop_tv_customer_sys) {
            if(builder.popTopOnClick != null){
                builder.popTopOnClick.SysOnclick();
            }
        } else if (view.getId() == R.id.pop_tv_customer_create) {
            if(builder.popTopOnClick != null){
                builder.popTopOnClick.CreateOnclick();
            }
        }
    }

    private void initView(View rootView) {
        popTvCustomerEdit = (TextView) rootView.findViewById(R.id.pop_tv_customer_edit);
        popTvCustomerEdit.setOnClickListener(PopTop.this);
        popTvCustomerDel = (TextView) rootView.findViewById(R.id.pop_tv_customer_del);
        popTvCustomerDel.setOnClickListener(PopTop.this);
        popLlEdit = (LinearLayout) rootView.findViewById(R.id.pop_ll_edit);
        popTvCustomerSys = (TextView) rootView.findViewById(R.id.pop_tv_customer_sys);
        popTvCustomerSys.setOnClickListener(PopTop.this);
        popTvCustomerCreate = (TextView) rootView.findViewById(R.id.pop_tv_customer_create);
        popTvCustomerCreate.setOnClickListener(PopTop.this);
        popLlCustomer = (LinearLayout) rootView.findViewById(R.id.pop_ll_customer);

        popLlEdit.setVisibility(View.GONE);
        popLlCustomer.setVisibility(View.GONE);



    }

    public static class Builder {
        protected final Context context;
        protected View view; 
        PopTopOnClick popTopOnClick;

        public Builder setPopTopOnClick(PopTopOnClick popTopOnClick) {
            this.popTopOnClick = popTopOnClick;
            return this;
        }


        public Builder setView(View view) {
            this.view = view;
            return this;
        }

        public Builder(@NonNull Context context) {
            this.context = context;
        }

        @UiThread
        public PopupWindow build() {
            return new PopTop(this);
        }

        @UiThread
        public PopupWindow show() {
            PopupWindow popTop = build();
            int windowPos[] = calculatePopWindowPos(view);
            windowPos[0] -= 15; //x 轴向左偏移15像素
            windowPos[1] -= 10; //y 轴向上偏移10像素
            popTop.showAtLocation(view, Gravity.TOP | Gravity.START, windowPos[0], windowPos[1]);
            return popTop;
        }
    }

    public int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

    /**
     * 计算出来的位置,y方向就在anchorView的上面和下面对齐显示,x方向就是与屏幕右边对齐显示
     * 如果anchorView的位置有变化,就可以适当自己额外加入偏移来修正
     *
     * @param anchorView 呼出window的view
     * @return window显示的左上角的xOff, yOff坐标
     */
    public static int[] calculatePopWindowPos(final View anchorView) {

        final int windowPos[] = new int[2];
        final int anchorLoc[] = new int[2];
        // 获取锚点View在屏幕上的左上角坐标位置
        anchorView.getLocationOnScreen(anchorLoc);
        final int anchorHeight = anchorView.getHeight();
        // 获取屏幕的高宽
        final int screenHeight = getScreenHeight(anchorView.getContext());
        final int screenWidth = getScreenWidth(anchorView.getContext());
        mainView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        // 计算contentView的高宽
        final int windowHeight = mainView.getMeasuredHeight();
        final int windowWidth = mainView.getMeasuredWidth();
        // 判断需要向上弹出还是向下弹出显示
        final boolean isNeedShowUp = (screenHeight - anchorLoc[1] - anchorHeight < windowHeight);
        if (isNeedShowUp) {
            windowPos[0] = screenWidth - windowWidth;
            windowPos[1] = anchorLoc[1] - windowHeight;
        } else {
            windowPos[0] = screenWidth - windowWidth;
            windowPos[1] = anchorLoc[1] + anchorHeight;
        }
        return windowPos;
    }

    /**
     * 获取屏幕高度(px)
     */
    public static int getScreenHeight(Context context) {
        return context.getResources().getDisplayMetrics().heightPixels;
    }

    /**
     * 获取屏幕宽度(px)
     */
    public static int getScreenWidth(Context context) {
        return context.getResources().getDisplayMetrics().widthPixels;
    }

    public interface PopTopOnClick{
        void EditOnclick();
        void DelOnclick();
        void SysOnclick();
        void CreateOnclick();
    }

}

末尾你能够

if (view.getId() == R.id.common_tv_right_more) { 
        new PopTop.Builder(this)
                .setView(findViewById(R.id.common_tv_right_more)) // 在某个空间的下面 
                .setPopTopOnClick(new PopTop.PopTopOnClick() {
                    @Override
                    public void EditOnclick() {
                        /* 编辑 监听*/ 
                    } 
                    @Override
                    public void DelOnclick() {
                        /*删除 监听*/
                    } 
                })
                .show();
    }

怎么说SamsungGalaxy A9Star中的Bixby具备旗舰级的竞相体验呢?首先最直观的感想正是Bixby具有最接近人声的语调,在富有的智能帮手中,Bixby是听起来最舒服的。不仅如此,Bixby还援助人声对象选拔,你可以选拔男声也许女声,配音人士分头是配音大师王聪和张喆。

末尾 同类想法

你能够写1个讲评的pop
例如

19463331伟德国际手机版 14

点击弹出键盘 pop 突显处理,键盘消失pop 消失。
那几个在此之前也有个项目里面有,可是从未如此写,就堆在一起,也远非反思,这一年还一向不blog,今后想一想的确太像了。

其次,SamsungGalaxy A玖Star的Bixby能够真的成效用听会看懂你心,你不用刻意想着用哪些语气才具让机器听懂你的话,你只要求用你日常最快乐的话里有话对Bixby说话就好了,而且Bixby还能够源源地球科学习,越来越懂你。

譬如说,你想知道前边那款鼠标只怕那款相机多少钱,只须求对Bixby说:“这些鼠标多少钱?”Bixby就能半自动启用视觉扫描,接着就能告诉你那款产品多少钱,在哪可以买到。其识别准确率和识别速度都以金榜题名的。

再比如,你想给某个微信好友发个红包,假如协调操作的话,恐怕需求多多操作,而有了Bixby,你只要求说一句:“帮自个儿给xx发个红包。”对,那便是这么轻松。

Bixby尽管聪慧,但她就像是人同一,刚开端对你不精晓,你供给逐步地教他有些你的生活习惯,那就须要你对Bixby举香港行政局部急迅命令的装置,例如,你只必要说:“深夜好。”Bixby就足以依照你设置好的一声令下,稳步实行一.关闭免滋扰;二.关闭蓝光过滤;三.告知您今日是几号星期几;四报告您明日的天气什么,适合穿什么服装;伍.末段还会张开QQ音乐播放你最欣赏的歌。而那总体只需求说一句“深夜好”,Bixby就好像最懂你的贴身小保姆同样。

幽默的是,Bixby还会趁机你的利用而赚取成长值,到达一定的成长值就足以荣升。只要求短按Bixby键,就能跻身Bixby主页,那里有最直观的科目,随着使用时间的增高,那些主页还能更懂你,例如你凡是买了去东方之珠的机票,Bixby主页会展现你的日程表,定期提示您去飞机场,还会告知您北京的天气什么。

19463331伟德国际手机版 15

理所当然了,你也足以和Bixby之间创建壹些唯有你们才懂的小对话,例如,你问Bixby:“世界上最有钱的人是什么人?”通过自定义功能可以让Bixby回答“是您啊!”是或不是很有意思呢?

19463331伟德国际手机版 16

能够看出,在三星(Samsung)Galaxy A九Star的299九元的标价段上,能和Bixby天公地道的差不多从未,在那几个价钱就能享用到旗舰级的智能交互体验,那是三星(Samsung)Galaxy
A玖 Star极具性价比的一点。

19463331伟德国际手机版 17

三星(Samsung)向来致力于钻研人工智能,改动交互体验,而那么些斟酌成果已经初见效能甚至大显神威。更令人欣慰的是,高科技(science and technology)并不表示高资金,只要299玖元就能买到的三星(Samsung)Galaxy
A玖Star就能体会到更懂你的Bixby。以后Taobao和京东上都有例外档次的优厚,而且现货出售,现在就去下单体验最强劲的智能语音帮手吧。回去搜狐,查看更多

主要编辑:

相关文章