精华内容
下载资源
问答
  • Launcher3简单的实现workspace icon焦点控制 最近客户提出Launcher3需要使用遥控器上下左右选择图标和点击enter进入选中的app,这个功能如果没有作改动,直接使用安卓原生逻辑控制会出现无法跳页,不同组件的view...

    Launcher3简单的实现workspace icon焦点控制

    最近客户提出Launcher3需要使用遥控器上下左右选择图标和点击enter进入选中的app,这个功能如果没有作改动,直接使用安卓原生逻辑控制会出现无法跳页,不同组件的view无法跳过去的情况。首先由另一个同事实现,因为项目急,而且之前也没有过这方面的需求(带触摸屏的东西,用遥控器控制有点脱裤子放屁的感觉),搞了一个通宵,然后写出来的逻辑各种乱,总之就是通过计算icon的个数还有当前选中的位置移动到下一个icon上,使用view的selector实现,因为桌面带了hostsea,allapps按钮等,逻辑复杂且通用性差,给后续维护提高了成本,因此需要想办法简化这个逻辑,提高通用性,花了大半天时间研究了下。 最终使用如下逻辑,简单实现焦点控制。
    1.首先遥控按键会通过系统转换成安卓定义的上下左右,这部分逻辑是mcu接受到遥控信号,向服务发送信息, 再由服务转换成安卓定义的键值向各个应用分发按键事件,我们直接通过安卓原生的方法来监听按键就好,这里我们主要用到的是
    在这里插入图片描述
    这几个键值分别对应遥控上的方向键上下左右和确认键,一般来说我们可以通过adb来模拟这些按键,
    adb shell input keyevent 19 ,后面的19对应键值,可以通过查看源码获取键值,或者网上查询也行。

    2.这些按键通过系统分发后,我们通过重写Activity的onKeyDown方法可以监听得到,在这里插入图片描述
    但是有一些按键如Enter键会被系统处理,这个方法里监听不到,因此我们需要重写一个更早获得按键消息得方法dispatchKeyEvent,去处理按键逻辑
    在这里插入图片描述
    可以看到这个方法的返回值为boolean,当我们返回true时,表示我们已经处理了此事件,系统将不会继续分发或者处理此次事件,所以我们就可以在这里实现自己的逻辑,然后return true,系统就不会继续处理这个事件。

    3.写焦点控制逻辑之前,我们需要在xml布局文件里面给不需要获取焦点的控件加入 android:focusable=“false” 这个属性,那么寻找焦点的时候就可以跳过这个控件直接找到下一个可以获取焦点的临近控件,比如这次自己添加的时间显示控件TextView就不需要选中,因为代码属于公司,这里也不方便贴太多,所以这里还是选择文字描述 。

    4.那万事具备,只欠东风了。 下面就贴一下焦点的处理逻辑代码,这里也是我自己研究了大半天弄出来的,希望大神们不要见笑,因为也没有比较深入的了解,所以大家有更好的方法也可以提出来共同进步。

        private boolean handlerWorkSpaceFocus(KeyEvent event) {
            try {
                int keyCode = event.getKeyCode();
                View curfocusview = getWindow().getDecorView().findFocus();
                if (curfocusview == null) {
                    return false;
                }
                int finddirection = 0;
                if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
                    finddirection = View.FOCUS_UP;
                } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
                    finddirection = View.FOCUS_DOWN;
                } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
                    finddirection = View.FOCUS_LEFT;
                } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
                    finddirection = View.FOCUS_RIGHT;
                }
                if (finddirection == 0) {
                    return false;
                }
                View nextfocusview = curfocusview.focusSearch(finddirection);
                Logcat.d("curfocusview =" + curfocusview + ", nextfocusview =" + nextfocusview);
                if (nextfocusview instanceof BubbleTextView) {
                    Logcat.d("next >>>" + ((BubbleTextView) nextfocusview).getText());
                }
                if (nextfocusview != null) {
                    nextfocusview.requestFocus();
                    return true;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    

    首先通过 View curfocusview = getWindow().getDecorView().findFocus();获取当前拥有focus的控件,如果控件为空,则表示当前还没有控件获取焦点,这里一般不需要处理,直接返回false,让系统需寻找第一个fucos控件, 如果有特殊需求,可以使用view.requestFocus();来申请焦点。
    然后我们通过传入的方向来赋值finddirection 这个值,来决定下一个寻找focus控件的方向,再通过当前拥有焦点的控件寻找它各个方向上最邻近且能获取焦点的控件,再通过 requestFocus方法申请焦点,就可以跳入下一个控件了。

    5.此次修改遇到的一些问题,比如使用原生的焦点灰色想换成别的颜色怎么修改,

    在这里插入图片描述
    在styles.xml中自己的style中加入colorControlHighlight属性可以自定义focus选中时高亮的颜色,如果不想使用默认的高亮的话,可以在自定义的控件里加入setDefaultFocusHighlightEnabled(false);//屏蔽默认高亮背景(8.0以后版本才能使用),如果不生效,可以重写view的onFocusChaged方法,直接把focused置为false传递给父类,这样view就不会去绘制focus时的高亮背景。
    在这里插入图片描述

    展开全文
  • 因为在我实在Launcher3的基础上又添加了两类Launcher,一类是GameLauncer--类似XBox等大型游戏机的主界面;而另一类就是TvLauncher--同普通的智能电视主界面一样,但我们的设计更加酷炫。所以其实是一种带...

    先聊会天儿,正文开始有标记,可直接跳过。或者你看效果满足了你的需求,直接去下载项目也行。

            最近一直在做一个类TvLauncher,为什么说是“类”呢?因为在我实在Launcher3的基础上又添加了两类Launcher,一类是GameLauncer--类似XBox等大型游戏机的主界面;而另一类就是TvLauncher--同普通的智能电视主界面一样,但我们的设计更加酷炫。所以其实是一种带有三种不同类型的Launcher界面,这儿咱们就单说一下咱们的电视Launcher。

            想知道我们的产品是什么吗?京东搜索“万核客厅一体机”,即可找到我们的产品,在产品介绍中就可以看到我做的三种Launcher界面。还可以详细了解一下我们的产品,对于普通用户来说,它叫客厅一体机,集普通Android用户,Android游戏发烧友用户以及电视盒子用户于一身的一台神器!对于我们Android程序猿来说,他也是一台很不错的开发机哦!(我这么说,经理会不会***我?吐舌头

            简单看一下我们的产品的三类Launcher主界面吧!很炫吧?,那就快去仔细看看吧!Please Go--京东万核旗舰店

                    

            看到里面的三种不同的主界面了吧,从左到右依次是:TvLauncher  PcLauncher  GameLauncher;

            看第一个 TVLauncher 这是头布局,有五种不同的FocusView!!!刚拿到时,还真是懵了一下子生气

            我们公司的产品及设计者决定要做一个与众不同的TvLauncher,看这篇文章的你应该懂得吧,他们稍稍的一个与众不同,我们就不知道要死多少脑细胞!不过,换个角度想想,还是挺喜欢他们的,因为这样可以让我的项目也与众不同,而且也会学习到更多的开发技巧。

            下面的这个TvRecyclerView基本就满足了你的各种开发需求了吧!

            我的项目是我参考别人的项目(参考文献见文末)修改完成的,但我的项目太复杂,展示起来麻烦,也增加了理解难度系数,这里就简单的把别人项目中的一个比较好的点摘出来,稍加修改,使之更能完美的符合我们的需求。

    -------------------------正文开始-------------------------

    首先看一下效果图:

       

    主要功能:

            1:任意锁定焦点位置,如本例是将开始的焦点框跟随Item种的FocusView,后面的是让焦点框锁定在屏幕中间;

            2:自由定义焦点缩放比例;焦点框的视觉效果;

            3:可以任意定义FocusView,不受Item影响,复杂布局处理起来就简单了;

    功能实现:

            在这里,我就只把关键代码附上,其它的可以去下载自由查看

            其中,我会我注意到的关键的地方做好注释,方便理解。

            1:RecyclerView的自定义及初始化:

            首先决定焦点框是否跟随Item移动和位置的关键方法如下:

        

    @Override
    public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) {
        /**
         * Creator:David
         * 首先,我们需要在绑定Holder的时候,按需要给item设置不同的焦点状态标记;
             * 然后,通过标记决定我们焦点框的状态
             */
        Object tag = child.getTag(R.id.focus_item_view_type);
        if (tag != null && ((int) tag == 1)) {
            //不需要锁定焦点框,正常返回时,焦点框跟随item移动。
            return super.requestChildRectangleOnScreen(child, rect, immediate);
        }
        //锁定焦点位置,让recyclerView自己控制滑动距离,使Item和焦点框重合
            focusItemOffsetX = focusItemOffsetY = 0;
        View focusView = child.findFocus();
        Rect rectFocus = new Rect();
        focusView.getDrawingRect(rectFocus);
        offsetDescendantRectToMyCoords(focusView, rectFocus);
        //dx dy 决定了焦点框锁定位置,可以自己设计算法,按需求确定位置
        int dx = 0, dy = 0;
        if (getLayoutManager().canScrollHorizontally()) {
            dx = rectFocus.left - (getWidth() - rectFocus.width()) / 2;
        } else if (getLayoutManager().canScrollVertically()) {
            dy = rectFocus.top - (getHeight() - rectFocus.height() / 2);
        }
        if (immediate) {
            scrollBy(dx, dy);
        } else {
            smoothScrollBy(dx, dy);
        }
        return true;
    }
    
            初始化RecyclerView:       


    private void initView() {
        recyclerView.setHasFixedSize(true);//当确定Item的改变不影响RecyclerView的宽高的时候可以设置setHasFixedSize(true);
        recyclerView.setLastLineItemHandKey(true, false, true, false);//设置四个边缘是否消耗按键,屏幕的上下左右
             gridLayoutManager = new GridLayoutManager(this, 4, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(gridLayoutManager);
        recyclerView.setOnLoadMoreListener(this);//自定义加载更多的回调接口
        recyclerView.addItemDecoration(new DividerGridItemDecoration(Color.GRAY, 20, 20, Color.GREEN, 20));
        /**
         * Creator:David
         * 设置需要占用多行或列的Item的占用列数
             */
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    
            @Override
            public int getSpanSize(int position) {
                switch (rvAdapter.getItemViewType(position)) {
                    case 2:// ItemViewType2时,让该Item占用两行或两列
                        return 2;
                    default:
                        return 1;
                }
            }
        });
        //初始化完成开始创建数据源并加载数据
            pageNumber = 0;
        createData(pageNumber);
    }

            2:Adapter和Holder的处理:

              这里在Library_recyclerView中,定义了他们两个的抽象类,我们在书写的时候可以直接继承,减少了相同代码的重复书写。只简单介绍用法,Livrary_recyclerView可以下载带全部效果的项目,然后在项目中查看。

            先看用法:

        

        private void createData(int pageNumber) {
            RecommendBean model;
            for (int i = pageNumber * pageCount; i < (pageNumber + 1) * pageCount; i++) {
                model = new RecommendBean();
                model.type = i == 0 ? 2 : 0;
                model.title = "" + i;
                model.imgResColor = getResources().getColor(R.color.color_d7292b);
                data.add(model);
            }
            if (rvAdapter == null) {
                rvAdapter = new GridMiddleAdapter(this, data);
                recyclerView.setAdapter(rvAdapter);
            } else {
                recyclerView.setLoadMoreComplete();//加载完成时调用
                         rvAdapter.notifyDataSetChanged();
                /**
                 * Creator:David
                 * 此处可能会需要另外的两种处理方法,方法中重写了 notifyDataSetChanged();
                 */
    //            rvAdapter.setDataList(data);
    //            //or
    //            rvAdapter.addDataList(data);
            }
    
        }
    
              再看Adapter: RvAdapter是可以自己按需求修改的,方便开发。

        

    public class GridMiddleAdapter extends RVAdapter<RecommendBean, RVHolder> {
    
        public GridMiddleAdapter(Context context, List<RecommendBean> mDataList) {
            super(context, mDataList);
        }
    
        @Override
        public RVHolder newViewHolder(ViewGroup parent, int viewType) {
            View view = null;
            RVHolder holder = null;
            switch (viewType) {
                case 1:
                    view = mInflater.inflate(R.layout.item_grid_page_diff_span, parent, false);
                    holder = new Holder(view, AbsFocusEffectView.FocusType.FOCUS_POSTER, true, true);
                    break;
                case 2:
                    view = mInflater.inflate(R.layout.item_grid_page_group, parent, false);
                    holder = new HolderGroup(view, AbsFocusEffectView.FocusType.FOCUS_POSTER, true, true);
                    break;
                default:
                    view = mInflater.inflate(R.layout.item_grid_page_h, parent, false);
                    holder = new Holder(view, AbsFocusEffectView.FocusType.FOCUS_POSTER, true, true);
                    break;
            }
    
            return holder;
        }
    
        @Override
        public int getItemViewType(int position) {
            return getItem(position).type;
        }
    }
    
             然后是Holder们:在RVHolder中可以自己按需求定义方法,方便开发。

        

    public class Holder extends RVHolder<RecommendBean> {
    
        @BindView(R.id.recommend_img)
        ImageView bg;
        @BindView(R.id.recommend_title)
        TextView title;
    
        public Holder(View itemView, String focusViewType, boolean isFocusScaleAnim, boolean isTranslateAnim) {
            super(itemView, focusViewType, isFocusScaleAnim, isTranslateAnim);
            ButterKnife.bind(this, itemView);
        }
    
        @Override
        public void bindData(RecommendBean model, int position, int state, int dx, int dy, int firstVisPosition, int lastVisPosition) {
            /**
             * Creator:David
             * Item做标记,区分不需要焦点居中的Item                */
            if (position < 3) {
                this.itemView.setTag(R.id.focus_item_view_type, 1);
            }
            if (model != null) {
                bg.setBackgroundColor(model.imgResColor);
                title.setText(model.title);
            }
        }
    
        @Override
        public void onItemClick(View view) {
            if (getAdapterPosition() == 30) {
                recyclerView.smoothScrollToPosition(0);
            }
            Toast.makeText(view.getContext(), "点击中间焦点:" + getAdapterPosition(), Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onFocusChanged(View view, boolean b) {
    
        }
    
        @Override
        public void destory() {
    
        }
    }
    
    public class HolderGroup extends RVHolder<RecommendBean> {
    
        @BindView(R.id.recommend_img)
        ImageView bg;
        @BindView(R.id.recommend_title)
        TextView title;
        @BindView(R.id.item1)
        FrameLayout item1;
        @BindView(R.id.recommend_img2)
        ImageView bg2;
        @BindView(R.id.recommend_title2)
        TextView title2;
        @BindView(R.id.item2)
        FrameLayout item2;
        @BindView(R.id.recommend_img3)
        ImageView bg3;
        @BindView(R.id.recommend_title3)
        TextView title3;
        @BindView(R.id.item3)
        FrameLayout item3;
        @BindView(R.id.recommend_img4)
        ImageView bg4;
        @BindView(R.id.recommend_title4)
        TextView title4;
        @BindView(R.id.item4)
        FrameLayout item4;
        @BindView(R.id.recommend_img5)
        ImageView bg5;
        @BindView(R.id.recommend_title5)
        TextView title5;
        @BindView(R.id.item5)
        FrameLayout item5;
    
        private List<ImageView> images;
        private List<TextView> tvs;
    
        public HolderGroup(View itemView, String focusViewType, boolean isFocusScaleAnim, boolean isTranslateAnim) {
            super(itemView, focusViewType, isFocusScaleAnim, isTranslateAnim);
            ButterKnife.bind(this, itemView);
            /**
             * Creator:David
             * 初始化Group中的焦点View
             */
            initView(item1, focusViewType, isFocusScaleAnim, isTranslateAnim);
            initView(item2, focusViewType, isFocusScaleAnim, isTranslateAnim);
            initView(item3, focusViewType, isFocusScaleAnim, isTranslateAnim);
            initView(item4, focusViewType, isFocusScaleAnim, isTranslateAnim);
            initView(item5, focusViewType, isFocusScaleAnim, isTranslateAnim);
    
            images = new ArrayList<>();
            images.add(bg);
            images.add(bg2);
            images.add(bg3);
            images.add(bg4);
            images.add(bg5);
    
            tvs = new ArrayList<>();
            tvs.add(title);
            tvs.add(title2);
            tvs.add(title3);
            tvs.add(title4);
            tvs.add(title5);
        }
    
        @Override
        public void bindData(RecommendBean model, int position, int state, int dx, int dy, int firstVisPosition, int lastVisPosition) {
            /**
            * Creator:David
            * Item做标记,区分不需要焦点居中的Item              */
            if (position < 3) {
                this.itemView.setTag(R.id.focus_item_view_type, 1);
            }
            if (model != null) {
                for (ImageView iv : images) {
                    showImageViewColor(iv, model.imgResColor);
                }
                for (TextView tv : tvs) {
                    showTextview(tv, model.title);
                }
            }
     
        }
    
        @Override
        public void onItemClick(View view) {
            String clickViewwID;
            switch (view.getId()) {
                case R.id.item1:
                    clickViewwID = "R.id.item1";
                    break;
                case R.id.item2:
                    clickViewwID = "R.id.item2";
                    break;
                case R.id.item3:
                    clickViewwID = "R.id.item3";
                    break;
                case R.id.item4:
                    clickViewwID = "R.id.item4";
                    break;
                case R.id.item5:
                    clickViewwID = "R.id.item5";
                    break;
                default:
                    clickViewwID = null;
                    break;
    
            }
            Toast.makeText(view.getContext(), "点击:" + getAdapterPosition() + ";ViewID:" +
                    clickViewwID, Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onFocusChanged(View view, boolean b) {
    
        }
    
        @Override
        public void destory() {
    
        }
    }

    OK  需要自己写的东西基本上就结束了,其实很简单,不过,还是需要稍微理解一下library_recyclerview中的内容;

    首先:目录结构:


     其实,这原先是个Module,但是个性使然,我不喜欢它,就把它移动到自己项目中,并且删掉了自己不需要的东西,你也可以去下载完整的依赖包和查看我参考的Demo,Demo中有所有可以实现的效果。


    参考文献:https://github.com/ShuKeW/TVRecyclerViewAndFocus

    本项目参考该项目,如有侵权,立即删除... ... 

    ==============================================
    @ Name : David
    @ email :david.forever.god@gmail.com
    Learn from yesterday, live for today, hope for tomorrow.

    展开全文
  • Launcher2启动后图标获取焦点问题

    千次阅读 2012-01-11 11:26:36
    在BubbleTextView.java中的init()方法中进行了焦点设置。如果不想在启动Android系统后桌面的快捷方式获取到焦点就将init()方法中的setFocusable(true);注释掉即可。这个设置主要是针对轨迹球做的。所以去掉之后没有...
        在BubbleTextView.java中的init()方法中进行了焦点设置。如果不想在启动Android系统后桌面的快捷方式获取到焦点就将init()方法中的setFocusable(true);注释掉即可。这个设置主要是针对轨迹球做的。所以去掉之后没有什么关系。
    展开全文
  • 这个函数是在ViewGroup里定义的,主要用于控制child View获取焦点的能力,比如是否阻止child View获取焦点。 他有三个常量可供设置 FOCUS_BEFORE_DESCENDANTS ViewGroup本身先对焦点进行处理,如果没有处理...

    这个函数是在ViewGroup里定义的,主要用于控制child View获取焦点的能力,比如是否阻止child View获取焦点。

     

    他有三个常量可供设置

     

    1. FOCUS_BEFORE_DESCENDANTS ViewGroup本身先对焦点进行处理,如果没有处理则分发给child View进行处理
    2. FOCUS_AFTER_DESCENDANTS 先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理
    3. FOCUS_BLOCK_DESCENDANTS ViewGroup本身进行处理,不管是否处理成功,都不会分发给ChildView进行处理
     
    我们看下这个方法的实现
    Setdescendantfocusability(int focusability)代码   收藏代码
    1. public void setDescendantFocusability(int focusability) {  
    2.         switch (focusability) {  
    3.             case FOCUS_BEFORE_DESCENDANTS:  
    4.             case FOCUS_AFTER_DESCENDANTS:  
    5.             case FOCUS_BLOCK_DESCENDANTS:  
    6.                 break;  
    7.             default:  
    8.                 throw new IllegalArgumentException("must be one of FOCUS_BEFORE_DESCENDANTS, "  
    9.                         + "FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS");  
    10.         }  
    11.         mGroupFlags &= ~FLAG_MASK_FOCUSABILITY;  
    12.         mGroupFlags |= (focusability & FLAG_MASK_FOCUSABILITY);  
    13.     }  
     

     

    可以看到,只有这三个常量可以设置,不是这三个常量会抛出异常的。

     

     

    设置后,会在requestFocus(int direction, Rect previouslyFocusedRect) 方法里根据设置进行相应的处理。来看下实现

     

    Requestfocus(int direction, rect previouslyfocusedrect)代码   收藏代码
    1. public boolean requestFocus(int direction, Rect previouslyFocusedRect) {  
    2.         if (DBG) {  
    3.             System.out.println(this + " ViewGroup.requestFocus direction="  
    4.                     + direction);  
    5.         }  
    6.         int descendantFocusability = getDescendantFocusability();  
    7.   
    8.         switch (descendantFocusability) {  
    9.             case FOCUS_BLOCK_DESCENDANTS:  
    10.                 return super.requestFocus(direction, previouslyFocusedRect);  
    11.             case FOCUS_BEFORE_DESCENDANTS: {  
    12.                 final boolean took = super.requestFocus(direction, previouslyFocusedRect);  
    13.                 return took ? took : onRequestFocusInDescendants(direction, previouslyFocusedRect);  
    14.             }  
    15.             case FOCUS_AFTER_DESCENDANTS: {  
    16.                 final boolean took = onRequestFocusInDescendants(direction, previouslyFocusedRect);  
    17.                 return took ? took : super.requestFocus(direction, previouslyFocusedRect);  
    18.             }  
    19.             default:  
    20.                 throw new IllegalStateException("descendant focusability must be "  
    21.                         + "one of FOCUS_BEFORE_DESCENDANTS, FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS "  
    22.                         + "but is " + descendantFocusability);  
    23.         }  
    24.     }  

     

    通过这里的实现可以看到上面定义的三个常量设置的意思。。

    转载于:https://www.cnblogs.com/MMLoveMeMM/articles/4214054.html

    展开全文
  • Launcher 学习

    2014-03-18 22:10:27
    (1)ADW_Launcher的下载和编译注意事项 Launcher数据库研究(一) Launcher预设Widget Launcher 上的动画效果 Launcher 抽屉图标更改 Android2.2 Luncher2扩展(仿Ipad DockBar、HTC预览图、批量添加...
  • Android移植Launcher

    千次阅读 2015-11-23 11:15:34
    Launcher 1.Launcher概述 Android系统启动后,加载的第一个程序就是Launcher应用。   Launcher的构 成:HomeScreen(workspace(AppWidget、WallPaper、LiveFolder、ShortCut))、HotSeats、AllApps/AllApplist:...
  • Launcher Drag分析

    2015-10-08 11:54:15
    1.Launcher的图标拖搁从Launcher开始,在Launcher的oncreate方法中设置了长按监听器,当我们长按图标时,会进入到Launcher的onLongClick方法 public boolean onLongClick(View v) {  if (LauncherLog.DEBUG) {  ...
  • 安卓系统是市场占用率最高、用户使用率最多的手机系统...本篇文章记录6.0.1版本launcher3(home程序)的加载过程及launcher.java部分函数分析。 安卓6.0.1版本指定launcher3为默认home程序,作为系统第一个app(由Activ...
  • launcher 学习网址

    2012-08-04 14:41:46
    (1)ADW_Launcher的下载和编译注意事项 Launcher数据库研究(一) Launcher预设Widget Launcher 上的动画效果 Launcher 抽屉图标更改 Android2.2 Luncher2扩展(仿Ipad DockBar、...Launcher2启动后图标获取焦点
  • android launcher开发(5) Launcher的显示

    千次阅读 2016-09-08 15:47:31
    当activity在oncreate()中进行了初始化,随之开始进入onresume()方法。这就意味着,该activity处于前台,并且拥有用户的焦点
  • android launcher梳理

    2014-09-23 21:08:56
    Android launcher - Workspace 明天将Workspace和DragLayer联合起来进行阐述。 废话就不多说,Workspace的大体功能前面已有简介,现在具体说其中的技术点。 技术点 如何通过xml文件来构造自己定义的View组件? ...
  • Launcher of Android

    2014-12-17 14:32:52
    Analyze the Launcher in Android It’s based on the android 4.0.3. You can find the configuration ofthe Launcher in /LINUX/android/packages/apps/Launcher In /res/xml/default_workspace.xml,you can fin
  • Launcher介绍总结

    2013-04-05 11:19:54
    一、主要文件和类  ...1.Launcher.java:launcher中主要的activity。   2.DragLayer.java:launcher layout的根view。DragLayer实际上也是一个抽象的界面,用来处理拖动和对事件进行初步
  • 文/Tamic:http://blog.csdn.net/sk719887916/article/details/53559667前言Android TV Launcher页在RecyclerView出来之前大家用GridView去...用GridView去处理焦点是有一定挑战性的,往往会出现不可预料焦点错乱问题。
  • Launcher类源码分析

    2021-08-17 09:20:39
    基于上一次获取系统类加载器这块进行分析: 关于这个方法的javadoc在之前已经阅读过了,不过这里再来仔细阅读一下加深印象:...所以接下来将焦点定位到获取Launcher实例上: 那有没有办法获得它的源代码呢?当然有...
  • Launcher3--抽屉

    千次阅读 2016-07-09 23:38:52
    抽屉是用来放置安卓手机中所有需要显示到Launcher上的(当然也可以进行过滤,将不想显示的隐藏起来)应用和小部件,启动应用、添加快捷方式到桌面、卸载等。之前也提到过,有些Launcher是没有抽屉的,如MIUI的Launcher...
  • (1)ADW_Launcher的下载和编译注意事项 Launcher数据库研究(一) Launcher预设Widget Launcher 上的动画效果 Launcher 抽屉图标更改 Android2.2 Luncher2扩展(仿Ipad DockBar、HTC预览图、批量添加快捷方式、...
  • 本篇讲解Launcher的oncreate的第四步setupViews();生成桌面布局,进行事件的绑定等,这里把setupViews();方法分为三步来讲解。以setupViews()方法中的setupOverviewPanel();为分界线,以上为第一步,以下为第三步...
  • 最近在学习Android Launcher的相关知识,在github上找到可以在Android studio上编译的Launcher 3代码,地址:https://github.com/rydanliu/Launcher3 Launcher 3的界面主要由SearchDropTargetBar、Workspace、...
  • Android launcher 桌面抽屉切换动画

    千次阅读 2014-11-13 17:03:44
    版本:1.0日期:2014.11.10 2014.11...百度桌面默认是随机切换不同的动画,Android默认是一个大小和透明的渐变的动画,如下: 下面开始分析在Launcher2(KitKat)的源码里面是如何实现这种效果的。二、下面列举相关的
  • Android Launcher全面剖析

    千次阅读 2013-05-29 09:35:29
    ... 首先来说说我为什么写这篇文章,最近公司要我负责搞Launcher,网上一查这方面的资料比较少,并且不全,研究起来相当困难,所以就写了这篇文章,希望对大家有帮助。这篇文章是相当长的,希望
  • android 机顶盒Launcher开发

    千次阅读 2015-03-23 23:10:30
    android 机顶盒Launcher开发,百度定位和ip定位城市获取天气信息,获取焦点放大,GridView分页显示应用列表,设置壁纸,支持多种分辨率机器。
  • package/apps/Launcher3/src/com/android/launcher3/FocusIndicatorView.java public FocusIndicatorView(Context context,AttributeSet attrs) { super(context,attrs); setAlpha(0); //setBackgroundColor(getR...
  • Launcher.java在AndroidManifest.xml里的属性如下: android:name="com.android.launcher2.Launcher" android:launchMode="singleTask" android:clearTaskOnLaunch="true
  • android中的launcher介绍

    千次阅读 2012-04-27 20:34:45
    1.Launcher.java:launcher中主要的activity。 2.DragLayer.java:launcher layout的rootview。DragLayer实际上也是一个抽象的界面,用来处理拖动和对事件进行初步处理然后按情况分发下去,角色是一个controller。它...
  • launcher.apk 分析

    2011-09-09 13:48:38
    http://blog.sina.com.cn/s/blog_674212810100y8t5.html Launcher.apk是android runtime的一部分,是系统起来运行的第一个应用程序。它的主要功能就是设置桌面背景图片,加载两个widget(桌面的小应用程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,540
精华内容 3,016
关键字:

launcher焦点