精华内容
下载资源
问答
  • 列表顶部的标签悬浮大家应该都知道,但“顶上去”是个啥玩意?

    列表顶部的标签悬浮大家应该都知道,但“顶上去”是个啥玩意?
    看一下效果图就知道了,注意看顶部的悬浮标签切换时的效果:

    这是我在之前一个自定义侧边索引栏的项目上修改的,对侧边索引栏的实现有兴趣的可以看一下之前的文章:自定义侧边快速索引栏

    思路是这样子的:
    - 布局里面增加一个和索引item长的一样的view,默认显示列表第一项的索引字母。
    - 监听列表的滑动,当列表可见的第二项是索引item时,计算并更新悬浮view的Y坐标,让它处于索引item的上方。
    - 监听列表的滑动,当列表可见第一项发生变化时,更新悬浮view显示的字母为当前可见第一项的索引字母。

    感觉比想象中简单啊。可以看出逻辑都是在滑动事件里,我们用RecyclerView的addOnScrollListener方法监听列表的滑动事件,在监听器里面实现上面的逻辑。说的可能不是很好,看代码就知道多简单了。

    监听器的代码如下:

    class mScrollListener extends RecyclerView.OnScrollListener {
    
        private int mFlowHeight;
        private int mCurrentPosition = -1;
    
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            mFlowHeight = vFlow.getMeasuredHeight();
        }
    
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
            View view = layoutManager.findViewByPosition(firstVisibleItemPosition + 1);
    
            if (view != null) {
                if (view.getTop() <= mFlowHeight && isItem(firstVisibleItemPosition + 1)) {
                    vFlow.setY(view.getTop() - mFlowHeight);
                } else {
                    vFlow.setY(0);
                }
            }
    
            if (mCurrentPosition != firstVisibleItemPosition) {
                mCurrentPosition = firstVisibleItemPosition;
                tvFlowIndex.setText(mList.get(mCurrentPosition).getFirstWord());
            }
        }
    
        /**
         * @param position 对应项的下标
         * @return 是否为标签项
         */
        private boolean isItem(int position) {
            return mAdapter.getItemViewType(position) == MainAdapter.VIEW_INDEX;
        }
    }

    这样就已经实现“顶上去的效果了”,妥妥的。

    最后说明一下,这个代码是使用RecyclerView实现的,要是用ListView的话是有问题的。ListView的item使用getTop()方法,刚开始拿到的应该是item距离整个ListView最顶部的距离,要都是这样还好处理,但是复用item的时候这个值又发生了变化。
    总之就是,在使用ListView的时候,我还没有好的实现方法。要是哪位知道怎么实现,希望可以留言分享一下,不胜感激!

    源码地址

    展开全文
  • 前置,document.body.clientHeight在标签&...开始我也纠结了很久,为什么无论怎么变都是0,多次查询后才了解到的。  具体代码: mounted:function() { this.screenHeight1=document.d...

        前置,document.body.clientHeight在标签<!DOCTYPE>的页面里得到的结果是0,所以得用document.documentElement.clientHeigh。刚开始我也纠结了很久,为什么无论怎么变都是0,多次查询后才了解到的。 

    具体代码:

    mounted:function() {

    this.screenHeight1=document.documentElement.clientHeight

    var that=this

    window.οnresize=()=>{

    return(()=>{

    that.screenHeight=document.documentElement.clientHeight

    })()

    }

    },

    watch:{

    screenHeight:function(newval,oldval) {

    if(newval

    this.hidshow=false

    }else{

    this.hidshow=true

    }

    }

    },

    也就是说,在页面可是区域变小的时候把底部给隐藏了。

    展开全文
  • 下午写代码时发现一个问题,项目中原来新建微博的界面下面的提示按钮(就是剩余多少字,图片等)不能被软键盘顶上去。我记得项目开始时还是好的,然后一开始找配置文件,布局文件中的设置。都不行,然后又把布局文件...

         下午写代码时发现一个问题,项目中原来新建微博的界面下面的提示按钮(就是剩余多少字,图片等)不能被软键盘顶上去。我记得项目刚开始时还是好的,然后一开始找配置文件,布局文件中的设置。都不行,然后又把布局文件和自定义组件考出来,新建项目有是好的。此时,我开始怀疑是否是继承了属性,然后看到这个界面Activity的确是继承了另外一个Activity。而另外一个Activity中设置了全屏和无信息栏的属性。于是,终于就解决了这个问题。

        总结,为Activity设置全屏,将导致软键盘无法推起组件。不管是否设置了adjustResize。

    展开全文
  • 又会导致标题栏被到界面以外,开始不知道是由于沉浸式状态栏引起的,感觉融云这么弄挺蠢的,后来发现是自己挺蠢的。 解决方法:仍使用沉浸式状态栏(直接设置了状态栏的颜色),在聊天界面的根布局添加 ...

    由于我用了沉浸式状态栏,导致在Androidmanifest中这样设置(融云的聊天界面通常设置)键盘遮盖了输入框

            <activity
                android:name=".ui.activity.ConversationActivity"
                android:configChanges="orientation|screenSize"
                android:screenOrientation="portrait"
                              android:windowSoftInputMode="stateHidden|adjustResize">
    
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
    
                    <category android:name="android.intent.category.DEFAULT" />
    
                    <data
                        android:host="包名"
                        android:pathPrefix="/conversation/"
                        android:scheme="rong" />
                </intent-filter>
            </activity>
    

    但是如果使用
    android:windowSoftInputMode="stateHidden|adjustPan"
    又会导致标题栏被顶到界面以外,刚开始不知道是由于沉浸式状态栏引起的,感觉融云这么弄挺蠢的,后来发现是自己挺蠢的。

    解决方法:仍使用沉浸式状态栏(直接设置了状态栏的颜色),在聊天界面的根布局添加android:fitsSystemWindows="true"
    想了想还是贴上具体代码,以备后用

    Androidmanifest:

    <activity
                android:name=".ui.activity.ConversationActivity"
                android:configChanges="orientation|screenSize"
                android:screenOrientation="portrait"
                              android:windowSoftInputMode="stateHidden|adjustResize">
    
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
    
                    <category android:name="android.intent.category.DEFAULT" />
    
                    <data
                        android:host="包名"
                        android:pathPrefix="/conversation/"
                        android:scheme="rong" />
                </intent-filter>
            </activity>

    xml布局:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        tools:context=".activity.chat.ConversationActivity"
        android:orientation="vertical"
        >
    
        <include
            android:id="@+id/nav_bar"
            layout="@layout/nav_bar"
            android:layout_width="match_parent"
            android:layout_height="55dp"
            />
    
        <fragment
            android:id="@+id/conversation"
            android:name="io.rong.imkit.fragment.ConversationFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            />
    
    </LinearLayout>

    activity中:

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_conversation);
            ButterKnife.bind(this);
            StatusBarUtil.setColor(this, UIUtils.getColor(R.color.main_yellow), 0);
        }

    其中StatusBarUtil类是个工具类

    package com.jaeger.library;
    
    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Color;
    import android.os.Build;
    import android.support.annotation.ColorInt;
    import android.support.annotation.IntRange;
    import android.support.design.widget.CoordinatorLayout;
    import android.support.v4.widget.DrawerLayout;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    import android.widget.LinearLayout;
    
    /**
     * Created by Jaeger on 16/2/14.
     * <p>
     * Email: chjie.jaeger@gmail.com
     * GitHub: https://github.com/laobie
     */
    public class StatusBarUtil {
    
        public static final int DEFAULT_STATUS_BAR_ALPHA = 112;
        private static final int FAKE_STATUS_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view;
        private static final int FAKE_TRANSLUCENT_VIEW_ID = R.id.statusbarutil_translucent_view;
        private static final int TAG_KEY_HAVE_SET_OFFSET = -123;
    
        /**
         * 设置状态栏颜色
         *
         * @param activity 需要设置的 activity
         * @param color    状态栏颜色值
         */
        public static void setColor(Activity activity, @ColorInt int color) {
            setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA);
        }
    
        /**
         * 设置状态栏颜色
         *
         * @param activity       需要设置的activity
         * @param color          状态栏颜色值
         * @param statusBarAlpha 状态栏透明度
         */
    
        public static void setColor(Activity activity, @ColorInt int color, @IntRange(from = 0, to = 255) int statusBarAlpha) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha));
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
                View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
                if (fakeStatusBarView != null) {
                    if (fakeStatusBarView.getVisibility() == View.GONE) {
                        fakeStatusBarView.setVisibility(View.VISIBLE);
                    }
                    fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha));
                } else {
                    decorView.addView(createStatusBarView(activity, color, statusBarAlpha));
                }
                setRootView(activity);
            }
        }
    
        /**
         * 为滑动返回界面设置状态栏颜色
         *
         * @param activity 需要设置的activity
         * @param color    状态栏颜色值
         */
        public static void setColorForSwipeBack(Activity activity, int color) {
            setColorForSwipeBack(activity, color, DEFAULT_STATUS_BAR_ALPHA);
        }
    
        /**
         * 为滑动返回界面设置状态栏颜色
         *
         * @param activity       需要设置的activity
         * @param color          状态栏颜色值
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setColorForSwipeBack(Activity activity, @ColorInt int color,
            @IntRange(from = 0, to = 255) int statusBarAlpha) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    
                ViewGroup contentView = ((ViewGroup) activity.findViewById(android.R.id.content));
                View rootView = contentView.getChildAt(0);
                int statusBarHeight = getStatusBarHeight(activity);
                if (rootView != null && rootView instanceof CoordinatorLayout) {
                    final CoordinatorLayout coordinatorLayout = (CoordinatorLayout) rootView;
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                        coordinatorLayout.setFitsSystemWindows(false);
                        contentView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha));
                        boolean isNeedRequestLayout = contentView.getPaddingTop() < statusBarHeight;
                        if (isNeedRequestLayout) {
                            contentView.setPadding(0, statusBarHeight, 0, 0);
                            coordinatorLayout.post(new Runnable() {
                                @Override
                                public void run() {
                                    coordinatorLayout.requestLayout();
                                }
                            });
                        }
                    } else {
                        coordinatorLayout.setStatusBarBackgroundColor(calculateStatusColor(color, statusBarAlpha));
                    }
                } else {
                    contentView.setPadding(0, statusBarHeight, 0, 0);
                    contentView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha));
                }
                setTransparentForWindow(activity);
            }
        }
    
        /**
         * 设置状态栏纯色 不加半透明效果
         *
         * @param activity 需要设置的 activity
         * @param color    状态栏颜色值
         */
        public static void setColorNoTranslucent(Activity activity, @ColorInt int color) {
            setColor(activity, color, 0);
        }
    
        /**
         * 设置状态栏颜色(5.0以下无半透明效果,不建议使用)
         *
         * @param activity 需要设置的 activity
         * @param color    状态栏颜色值
         */
        @Deprecated
        public static void setColorDiff(Activity activity, @ColorInt int color) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            transparentStatusBar(activity);
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            // 移除半透明矩形,以免叠加
            View fakeStatusBarView = contentView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
            if (fakeStatusBarView != null) {
                if (fakeStatusBarView.getVisibility() == View.GONE) {
                    fakeStatusBarView.setVisibility(View.VISIBLE);
                }
                fakeStatusBarView.setBackgroundColor(color);
            } else {
                contentView.addView(createStatusBarView(activity, color));
            }
            setRootView(activity);
        }
    
        /**
         * 使状态栏半透明
         * <p>
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity 需要设置的activity
         */
        public static void setTranslucent(Activity activity) {
            setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);
        }
    
        /**
         * 使状态栏半透明
         * <p>
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity       需要设置的activity
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setTranslucent(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            setTransparent(activity);
            addTranslucentView(activity, statusBarAlpha);
        }
    
        /**
         * 针对根布局是 CoordinatorLayout, 使状态栏半透明
         * <p>
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity       需要设置的activity
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setTranslucentForCoordinatorLayout(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            transparentStatusBar(activity);
            addTranslucentView(activity, statusBarAlpha);
        }
    
        /**
         * 设置状态栏全透明
         *
         * @param activity 需要设置的activity
         */
        public static void setTransparent(Activity activity) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            transparentStatusBar(activity);
            setRootView(activity);
        }
    
        /**
         * 使状态栏透明(5.0以上半透明效果,不建议使用)
         * <p>
         * 适用于图片作为背景的界面,此时需要图片填充到状态栏
         *
         * @param activity 需要设置的activity
         */
        @Deprecated
        public static void setTranslucentDiff(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                // 设置状态栏透明
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                setRootView(activity);
            }
        }
    
        /**
         * 为DrawerLayout 布局设置状态栏变色
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         * @param color        状态栏颜色值
         */
        public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) {
            setColorForDrawerLayout(activity, drawerLayout, color, DEFAULT_STATUS_BAR_ALPHA);
        }
    
        /**
         * 为DrawerLayout 布局设置状态栏颜色,纯色
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         * @param color        状态栏颜色值
         */
        public static void setColorNoTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) {
            setColorForDrawerLayout(activity, drawerLayout, color, 0);
        }
    
        /**
         * 为DrawerLayout 布局设置状态栏变色
         *
         * @param activity       需要设置的activity
         * @param drawerLayout   DrawerLayout
         * @param color          状态栏颜色值
         * @param statusBarAlpha 状态栏透明度
         */
        public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color,
            @IntRange(from = 0, to = 255) int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            } else {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
            // 生成一个状态栏大小的矩形
            // 添加 statusBarView 到布局中
            ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
            View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID);
            if (fakeStatusBarView != null) {
                if (fakeStatusBarView.getVisibility() == View.GONE) {
                    fakeStatusBarView.setVisibility(View.VISIBLE);
                }
                fakeStatusBarView.setBackgroundColor(color);
            } else {
                contentLayout.addView(createStatusBarView(activity, color), 0);
            }
            // 内容布局不是 LinearLayout 时,设置padding top
            if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
                contentLayout.getChildAt(1)
                    .setPadding(contentLayout.getPaddingLeft(), getStatusBarHeight(activity) + contentLayout.getPaddingTop(),
                        contentLayout.getPaddingRight(), contentLayout.getPaddingBottom());
            }
            // 设置属性
            setDrawerLayoutProperty(drawerLayout, contentLayout);
            addTranslucentView(activity, statusBarAlpha);
        }
    
        /**
         * 设置 DrawerLayout 属性
         *
         * @param drawerLayout              DrawerLayout
         * @param drawerLayoutContentLayout DrawerLayout 的内容布局
         */
        private static void setDrawerLayoutProperty(DrawerLayout drawerLayout, ViewGroup drawerLayoutContentLayout) {
            ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);
            drawerLayout.setFitsSystemWindows(false);
            drawerLayoutContentLayout.setFitsSystemWindows(false);
            drawerLayoutContentLayout.setClipToPadding(true);
            drawer.setFitsSystemWindows(false);
        }
    
        /**
         * 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用)
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         * @param color        状态栏颜色值
         */
        @Deprecated
        public static void setColorForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                // 生成一个状态栏大小的矩形
                ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
                View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID);
                if (fakeStatusBarView != null) {
                    if (fakeStatusBarView.getVisibility() == View.GONE) {
                        fakeStatusBarView.setVisibility(View.VISIBLE);
                    }
                    fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, DEFAULT_STATUS_BAR_ALPHA));
                } else {
                    // 添加 statusBarView 到布局中
                    contentLayout.addView(createStatusBarView(activity, color), 0);
                }
                // 内容布局不是 LinearLayout 时,设置padding top
                if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
                    contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);
                }
                // 设置属性
                setDrawerLayoutProperty(drawerLayout, contentLayout);
            }
        }
    
        /**
         * 为 DrawerLayout 布局设置状态栏透明
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {
            setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA);
        }
    
        /**
         * 为 DrawerLayout 布局设置状态栏透明
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout,
            @IntRange(from = 0, to = 255) int statusBarAlpha) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            setTransparentForDrawerLayout(activity, drawerLayout);
            addTranslucentView(activity, statusBarAlpha);
        }
    
        /**
         * 为 DrawerLayout 布局设置状态栏透明
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        public static void setTransparentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            } else {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
    
            ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
            // 内容布局不是 LinearLayout 时,设置padding top
            if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
                contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);
            }
    
            // 设置属性
            setDrawerLayoutProperty(drawerLayout, contentLayout);
        }
    
        /**
         * 为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用)
         *
         * @param activity     需要设置的activity
         * @param drawerLayout DrawerLayout
         */
        @Deprecated
        public static void setTranslucentForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                // 设置状态栏透明
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                // 设置内容布局属性
                ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
                contentLayout.setFitsSystemWindows(true);
                contentLayout.setClipToPadding(true);
                // 设置抽屉布局属性
                ViewGroup vg = (ViewGroup) drawerLayout.getChildAt(1);
                vg.setFitsSystemWindows(false);
                // 设置 DrawerLayout 属性
                drawerLayout.setFitsSystemWindows(false);
            }
        }
    
        /**
         * 为头部是 ImageView 的界面设置状态栏全透明
         *
         * @param activity       需要设置的activity
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTransparentForImageView(Activity activity, View needOffsetView) {
            setTranslucentForImageView(activity, 0, needOffsetView);
        }
    
        /**
         * 为头部是 ImageView 的界面设置状态栏透明(使用默认透明度)
         *
         * @param activity       需要设置的activity
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageView(Activity activity, View needOffsetView) {
            setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);
        }
    
        /**
         * 为头部是 ImageView 的界面设置状态栏透明
         *
         * @param activity       需要设置的activity
         * @param statusBarAlpha 状态栏透明度
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageView(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha,
            View needOffsetView) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return;
            }
            setTransparentForWindow(activity);
            addTranslucentView(activity, statusBarAlpha);
            if (needOffsetView != null) {
                Object haveSetOffset = needOffsetView.getTag(TAG_KEY_HAVE_SET_OFFSET);
                if (haveSetOffset != null && (Boolean) haveSetOffset) {
                    return;
                }
                ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams();
                layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin + getStatusBarHeight(activity),
                    layoutParams.rightMargin, layoutParams.bottomMargin);
                needOffsetView.setTag(TAG_KEY_HAVE_SET_OFFSET, true);
            }
        }
    
        /**
         * 为 fragment 头部是 ImageView 的设置状态栏透明
         *
         * @param activity       fragment 对应的 activity
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageViewInFragment(Activity activity, View needOffsetView) {
            setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);
        }
    
        /**
         * 为 fragment 头部是 ImageView 的设置状态栏透明
         *
         * @param activity       fragment 对应的 activity
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTransparentForImageViewInFragment(Activity activity, View needOffsetView) {
            setTranslucentForImageViewInFragment(activity, 0, needOffsetView);
        }
    
        /**
         * 为 fragment 头部是 ImageView 的设置状态栏透明
         *
         * @param activity       fragment 对应的 activity
         * @param statusBarAlpha 状态栏透明度
         * @param needOffsetView 需要向下偏移的 View
         */
        public static void setTranslucentForImageViewInFragment(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha,
            View needOffsetView) {
            setTranslucentForImageView(activity, statusBarAlpha, needOffsetView);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                clearPreviousSetting(activity);
            }
        }
    
        /**
         * 隐藏伪状态栏 View
         *
         * @param activity 调用的 Activity
         */
        public static void hideFakeStatusBarView(Activity activity) {
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
            if (fakeStatusBarView != null) {
                fakeStatusBarView.setVisibility(View.GONE);
            }
            View fakeTranslucentView = decorView.findViewById(FAKE_TRANSLUCENT_VIEW_ID);
            if (fakeTranslucentView != null) {
                fakeTranslucentView.setVisibility(View.GONE);
            }
        }
    
        ///
    
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private static void clearPreviousSetting(Activity activity) {
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
            if (fakeStatusBarView != null) {
                decorView.removeView(fakeStatusBarView);
                ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
                rootView.setPadding(0, 0, 0, 0);
            }
        }
    
        /**
         * 添加半透明矩形条
         *
         * @param activity       需要设置的 activity
         * @param statusBarAlpha 透明值
         */
        private static void addTranslucentView(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha) {
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            View fakeTranslucentView = contentView.findViewById(FAKE_TRANSLUCENT_VIEW_ID);
            if (fakeTranslucentView != null) {
                if (fakeTranslucentView.getVisibility() == View.GONE) {
                    fakeTranslucentView.setVisibility(View.VISIBLE);
                }
                fakeTranslucentView.setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0));
            } else {
                contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));
            }
        }
    
        /**
         * 生成一个和状态栏大小相同的彩色矩形条
         *
         * @param activity 需要设置的 activity
         * @param color    状态栏颜色值
         * @return 状态栏矩形条
         */
        private static View createStatusBarView(Activity activity, @ColorInt int color) {
            return createStatusBarView(activity, color, 0);
        }
    
        /**
         * 生成一个和状态栏大小相同的半透明矩形条
         *
         * @param activity 需要设置的activity
         * @param color    状态栏颜色值
         * @param alpha    透明值
         * @return 状态栏矩形条
         */
        private static View createStatusBarView(Activity activity, @ColorInt int color, int alpha) {
            // 绘制一个和状态栏一样高的矩形
            View statusBarView = new View(activity);
            LinearLayout.LayoutParams params =
                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
            statusBarView.setLayoutParams(params);
            statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
            statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID);
            return statusBarView;
        }
    
        /**
         * 设置根布局参数
         */
        private static void setRootView(Activity activity) {
            ViewGroup parent = (ViewGroup) activity.findViewById(android.R.id.content);
            for (int i = 0, count = parent.getChildCount(); i < count; i++) {
                View childView = parent.getChildAt(i);
                if (childView instanceof ViewGroup) {
                    childView.setFitsSystemWindows(true);
                    ((ViewGroup) childView).setClipToPadding(true);
                }
            }
        }
    
        /**
         * 设置透明
         */
        private static void setTransparentForWindow(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
                activity.getWindow()
                    .getDecorView()
                    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity.getWindow()
                    .setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    
        /**
         * 使状态栏透明
         */
        @TargetApi(Build.VERSION_CODES.KITKAT)
        private static void transparentStatusBar(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            } else {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    
        /**
         * 创建半透明矩形 View
         *
         * @param alpha 透明值
         * @return 半透明 View
         */
        private static View createTranslucentStatusBarView(Activity activity, int alpha) {
            // 绘制一个和状态栏一样高的矩形
            View statusBarView = new View(activity);
            LinearLayout.LayoutParams params =
                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
            statusBarView.setLayoutParams(params);
            statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));
            statusBarView.setId(FAKE_TRANSLUCENT_VIEW_ID);
            return statusBarView;
        }
    
        /**
         * 获取状态栏高度
         *
         * @param context context
         * @return 状态栏高度
         */
        private static int getStatusBarHeight(Context context) {
            // 获得状态栏高度
            int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
            return context.getResources().getDimensionPixelSize(resourceId);
        }
    
        /**
         * 计算状态栏颜色
         *
         * @param color color值
         * @param alpha alpha值
         * @return 最终的状态栏颜色
         */
        private static int calculateStatusColor(@ColorInt int color, int alpha) {
            if (alpha == 0) {
                return color;
            }
            float a = 1 - alpha / 255f;
            int red = color >> 16 & 0xff;
            int green = color >> 8 & 0xff;
            int blue = color & 0xff;
            red = (int) (red * a + 0.5);
            green = (int) (green * a + 0.5);
            blue = (int) (blue * a + 0.5);
            return 0xff << 24 | red << 16 | green << 8 | blue;
        }
    }
    
    展开全文
  • 开始出现问题以为是toolbar设置的高度的问题,但是仔细检查下,是忘了在布局文件的根布局中设置 android:fitsSystemWindows="true" 至此,完美解决这个问题。再出现类似相关问题,会继续在这个博客下更新
  • 发现一个css3的一个属性 position:sticky;这个就可以直接实现以上功能,简单实用,而且不需要经过繁杂的计算 div{ position: sticky; /*如果偏移量不超过下边预设值,这个效果是relative,超过就是fixed的效果*/ top...
  • 开始,我们调一个获取不到数据的bug,我安卓没有任何问题,他的苹果怎样都拿不到数据,找着找着,我们发现连从页面取值都取不了。这里就折腾了好久,期间同事不断提示我ios的键盘弹起来,页面底部会出现很大一片...
  • 本人学的是android原生的,现在实习,公司本意呢想让新人学习下新技术就把我安排到开发android h5页面去了,虽然之前学过一点h5的知识,但是呢实际操作起来不如意啊。遇到这个问题时,我不知道怎么做啊,还是度娘...
  • TalkingData CTO肖文峰:研发工程师,你为啥升不上去? 发表于2015-08-14 16:06| 1391次阅读| 来源CSDN| 4 条评论| 作者肖文峰 开发者研发管理工程师个人技能升职 摘要:TalkingData CTO肖文峰:不同...
  • ,今天录了个屏个大家分享一下成果,录屏软件比较垃圾,帧频不够,看上去比较卡,其实真实展示效果很流畅,大家凑合看吧,有需要源码的童鞋可以留下联系方式(注:平台中的色块就是以后放置各个平台的缩略图的): ...
  • Flink 灵魂两百问,这谁得住?

    千次阅读 2019-07-23 21:40:39
    59、flink on yarn 方式,这样理解不知道对不对,yarn-session这个脚本其实就是准备yarn环境的,执行run任务的时候,根据yarn-session初始化的yarnDescription 把 flink 任务的jobGraph提交到yarn上去执行 ...
  • 泰康人寿付:IT规划 SOA是目标

    千次阅读 2008-12-19 14:14:00
     因为这个看上去实施得非常顺利、应用效果也不错的项目,实际上包含了诸多挑战。“第一”的滋味,双方都身有体会。作为合作伙伴在全球实施的第一个案例,很多技术上的细节都是双方一起“摸着石头过河”确定的。 ...
  • 在后续开发还没有开始之前,决定把这次开发当中学习到的一些知识和遇到的一些问题和大家的一起分享一下,由于也是开始做Android开发,并且是初次做电视机(机盒)上的开发,有什么不正确的地方,欢迎大家批评...
  • 人工智能顶级会议与国际期刊总结

    千次阅读 2019-04-01 18:42:50
    这个会议基本上控制在Michael Jordan的徒子徒孙手中, 所以对Jordan系的人来说, 发NIPS并不是难事, 一些未必很强的工作也能发上去, 但对这个圈子之外的人来说, 想发一篇实在很难, 因为留给”外人”的口子很小....
  • 最近做了个聊天页面遇到个问题,当我点击input输入文字的时候会弹起个软键盘将整个页面都顶上去了,如下!](https://img-blog.csdni 为了解决这问题在网上找了好久,但没什么人说这个,最后在uniapp文档里找到了解决...
  • 还挣扎在温饱线的情况下,先通过拿来主义弥补自己巨大的差距,等基础层面上去了,自然一些创造性东西就出来了,现在国内的软件企业大部分通过应用级开发进行圈地运动,先守住自己的护城河,等有了江湖地位之后再花...
  • 完成的时候就发现了一个问题.RecyclerView和EditText合用的时候请求焦点冲突,造成输入法软键盘一闪而逝的问题.后来网上找到方法解决了.当时找到的不是这一个,解决方法是一样的主要是在layout文件的 RecyclerView...
  • 前面的文章介绍了如何实现广告...翻了翻资料,发现修改状态栏的颜色倒是可行,但要把轮播图顶上去就不容易了。再瞅瞅淘宝和当当,原来两个大厂的App都没做出这个效果。正想跟产品经理说这个实现不了,谁料产品大姐笑
  • 1.按钮hover上去变色(渐变,从底部向上变) .btn-item { text-transform: uppercase; width: 250px; line-height: 50px; text-align: center; font-size: 18px; font-family: Oswald;
  • react-native 滑动吸顶效果

    千次阅读 2019-06-02 03:28:52
    具体代码就是这样实现了,算是比较完美的方案,特别是照顾了性能,各位可以基于这个封装来实现更复杂的需求,原理大概就是这个原理了,在前端动画领域,自己确实也就入门水平,如有问题,请直接指出。 另外,这...
  • Android软键盘不布局的解决方法

    千次阅读 2018-03-07 11:56:15
    PS:这个问题迷惑了我大半天的时间,开始碰到问题的时候,各种百度,简书的找答案,然而答案给的确不尽人意…. 言归正传: 先说下我的需求,我是要做个dialog自定义弹框,在弹框的顶部有搜索栏,下面显示弹框内容,直接上图...
  • 最近在做项目的时候有一个分页功能 问题: ... 解决办法: ... window.scrollTo(0, 0);...直接在方法里边添加window.scrollTo(0, 0);这句代码就可以自动回到顶部,从而达到从顶部开始预览的效果。...
  • 前段时间UI同学拿着知乎... 我有种不好的预感,接下来上线不久的项目可以要大改- -! 这是知乎热榜小程序, 其实这并不是把搜索栏放在了顶部标题栏里面,而是把小程序把设置为全屏模式,只保留右上角的胶囊...
  • 学习ReactNative开发,在做一个提交表单的页面,发现当我要输入内容的时候弹出的键盘会把底部导航条起来,这样子非常难看,如下图: 多方查找资料下,发现一个很好的解决方案, 将AndroidManifest.xml文件...
  • 本文代码实现基本按照《数据结构》课本目录顺序,外加大量的复杂算法实现,一篇文章足够。能换你一个收藏了吧?
  • 且不说很多fellow都是学生们扛上去的,自己其实除了觥筹交错别的早就忘光了,哪怕来一个还奋斗在科研第一线的fellow,等你见到的时候人家已经在台上了,台下至少几十个学生,等人家讲完没几分钟,就又被老板们拉着...
  • 世界顶级人工智能会议的总结

    万次阅读 2019-05-04 16:20:30
    这个会议基本上控制在Michael Jordan的徒子徒孙手中, 所以对Jordan系的人来说, 发NIPS并不是难事, 一些未必很强的工作也能发上去, 但对这个圈子之外的人来说, 想发一篇实在很难, 因为留给”外人”的口子很小....
  •  当你撞上这个 “编程玻璃” 时,那些教程和线上资源对你的意义已经不大了,因为他们默认你已经是一个编程好手了。更让整个编程学习进阶之路变难的因素是,你根本不知道自己缺什么 (you don’t know what ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,726
精华内容 6,290
关键字:

刚顶上去