Giter Club home page Giter Club logo

highlight's Introduction

Highlight

Download

一个用于app指向性功能高亮的库。

有任何意见,欢迎提issue。新建dev分支,欢迎pull request。

效果图

竖屏:

横屏:

引入

下载代码,然后:

dependencies {
       compile project(':highlight')
}

或者

    compile 'com.isanwenyu.highlight:highlight:1.8.0'

再或者

<dependency>
  <groupId>com.isanwenyu.highlight</groupId>
  <artifactId>highlight</artifactId>
  <version>1.8.0</version>
  <type>pom</type>
</dependency>

用法

最新用法详情:https://isanwenyu.github.io/2016/11/23/HighLight-latest-usage/

Next Mode 下一步模式

Enable next mode and invoke show() method then invoke next() method in HighLight to display tip view in order till remove itself 调用enableNext()开启next模式并显示,然后调用next()方法显示下一个提示布局 直到删除自己

1. 开启next模式并显示

    /**
     * 显示 next模式 我知道了提示高亮布局
     * @param view id为R.id.iv_known的控件
     * @author [email protected]
     */
    public  void showNextKnownTipView(View view)
    {
        mHightLight = new HighLight(MainActivity.this)//
                .autoRemove(false)//设置背景点击高亮布局自动移除为false 默认为true
//                .intercept(false)//设置拦截属性为false 高亮布局不影响后面布局的滑动效果
                .intercept(true)//拦截属性默认为true 使下方ClickCallback生效
                .enableNext()//开启next模式并通过show方法显示 然后通过调用next()方法切换到下一个提示布局,直到移除自身
//                .setClickCallback(new HighLight.OnClickCallback() {
//                    @Override
//                    public void onClick() {
//                        Toast.makeText(MainActivity.this, "clicked and remove HightLight view by yourself", Toast.LENGTH_SHORT).show();
//                        remove(null);
//                    }
//                })
                .anchor(findViewById(R.id.id_container))//如果是Activity上增加引导层,不需要设置anchor
                .addHighLight(R.id.btn_rightLight,R.layout.info_known,new OnLeftPosCallback(45),new RectLightShape(0,0,15,0,0))//矩形去除圆角
                .addHighLight(R.id.btn_light,R.layout.info_known,new OnRightPosCallback(5),new BaseLightShape(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,5,getResources().getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,5,getResources().getDisplayMetrics()),0) {
                    @Override
                    protected void resetRectF4Shape(RectF viewPosInfoRectF, float dx, float dy) {
                        //缩小高亮控件范围
                        viewPosInfoRectF.inset(dx,dy);
                    }

                    @Override
                    protected void drawShape(Bitmap bitmap, HighLight.ViewPosInfo viewPosInfo) {
                        //custom your hight light shape 自定义高亮形状
                        Canvas canvas = new Canvas(bitmap);
                        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
                        paint.setDither(true);
                        paint.setAntiAlias(true);
                        //blurRadius必须大于0
                        if(blurRadius>0){
                            paint.setMaskFilter(new BlurMaskFilter(blurRadius, BlurMaskFilter.Blur.SOLID));
                        }
                        RectF rectF = viewPosInfo.rectF;
                        canvas.drawOval(rectF, paint);
                    }
                })
                .addHighLight(R.id.btn_bottomLight,R.layout.info_known,new OnTopPosCallback(),new CircleLightShape())
                .addHighLight(view,R.layout.info_known,new OnBottomPosCallback(10),new OvalLightShape(5,5,20))
                .setOnRemoveCallback(new HighLightInterface.OnRemoveCallback() {//监听移除回调 
                    @Override
                    public void onRemove() {
                        Toast.makeText(MainActivity.this, "The HightLight view has been removed", Toast.LENGTH_SHORT).show();

                    }
                })
                .setOnShowCallback(new HighLightInterface.OnShowCallback() {//监听显示回调
                    @Override
                    public void onShow(HightLightView hightLightView) {
                        Toast.makeText(MainActivity.this, "The HightLight view has been shown", Toast.LENGTH_SHORT).show();
                    }
                }).setOnNextCallback(new HighLightInterface.OnNextCallback() {
                    @Override
                    public void onNext(HightLightView hightLightView, View targetView, View tipView) {
                        // targetView 目标按钮 tipView添加的提示布局 可以直接找到'我知道了'按钮添加监听事件等处理
                        Toast.makeText(MainActivity.this, "The HightLight show next TipView,targetViewID:"+(targetView==null?null:targetView.getId())+",tipViewID:"+(tipView==null?null:tipView.getId()), Toast.LENGTH_SHORT).show();
                    }
                });
        mHightLight.show();
    }

2. 调用next()方法依次显示之前添加到提示布局 最后自动移除

/**
     * 响应所有R.id.iv_known的控件的点击事件
     * <p>
     *  移除高亮布局
     * </p>
     *
     * @param view
     */
    public void clickKnown(View view)
    {
        if(mHightLight.isShowing() && mHightLight.isNext())//如果开启next模式
        {
            mHightLight.next();
        }else
        {
            remove(null);
        }
    }

3. 下一步回调监听

    /**
     * 下一个回调监听 只有Next模式下生效
     */
    public static interface OnNextCallback {
        /**
         * 监听下一步动作
         *
         * @param hightLightView 高亮布局控件
         * @param targetView     高亮目标控件
         * @param tipView        高亮提示控件
         */
        void onNext(HightLightView hightLightView, View targetView, View tipView);
    }

4. mAnchor根布局完成回调监听(页面加载完成,自动显示)

针对下方问题4的优化方案 在Activity或Fragment onCreated方法中构造HighLight 通过mAnchor.getViewTreeObserver().addOnGlobalLayoutListener(this)实现

    /**
     * 当界面布局完成显示next模式提示布局
     * 显示方法必须在onLayouted中调用
     * 适用于Activity及Fragment中使用
     * 可以直接在onCreated方法中调用
     * @author [email protected]
     */
    public  void showNextTipViewOnCreated(){
        mHightLight = new HighLight(MainActivity.this)//
                .anchor(findViewById(R.id.id_container))//如果是Activity上增加引导层,不需要设置anchor
                .autoRemove(false)
                .enableNext()
                .setOnLayoutCallback(new HighLightInterface.OnLayoutCallback() {
                    @Override
                    public void onLayouted() {
                        //mAnchor界面布局完成添加tipview
                        mHightLight.addHighLight(R.id.btn_rightLight,R.layout.info_gravity_left_down,new OnLeftPosCallback(45),new RectLightShape())
                                .addHighLight(R.id.btn_light,R.layout.info_gravity_left_down,new OnRightPosCallback(5),new CircleLightShape())
                                .addHighLight(R.id.btn_bottomLight,R.layout.info_gravity_left_down,new OnTopPosCallback(),new CircleLightShape());
                        //然后显示高亮布局
                        mHightLight.show();
                    }
                })
                .setClickCallback(new HighLight.OnClickCallback() {
                    @Override
                    public void onClick() {
                        Toast.makeText(MainActivity.this, "clicked and show next tip view by yourself", Toast.LENGTH_SHORT).show();
                        mHightLight.next();
                    }
                });
    }
    

Nomarl Mode 普通模式

对于上面效果图中的一个需要高亮的View,需要通过下面的代码

    /**
     * 显示我知道了提示高亮布局
     * @param view id为R.id.iv_known的控件
     * @author [email protected]
     */
    public  void showKnownTipView(View view)
    {
        mHightLight = new HighLight(MainActivity.this)//
                .autoRemove(false)//设置背景点击高亮布局自动移除为false 默认为true
                .intercept(false)//设置拦截属性为false 高亮布局不影响后面布局的滑动效果 而且使下方点击回调失效
                .setClickCallback(new HighLight.OnClickCallback() {
                    @Override
                    public void onClick() {
                        Toast.makeText(MainActivity.this, "clicked and remove HightLight view by yourself", Toast.LENGTH_SHORT).show();
                        remove(null);
                    }
                })
                .anchor(findViewById(R.id.id_container))//如果是Activity上增加引导层,不需要设置anchor
                .addHighLight(R.id.btn_rightLight,R.layout.info_known,new OnLeftPosCallback(45),new RectLightShape())
                .addHighLight(R.id.btn_light,R.layout.info_known,new OnRightPosCallback(5),new CircleLightShape(0,0,0))
                .addHighLight(R.id.btn_bottomLight,R.layout.info_known,new OnTopPosCallback(),new CircleLightShape())
                .addHighLight(view,R.layout.info_known,new OnBottomPosCallback(10),new OvalLightShape(5,5,20));
        mHightLight.show();

//        //added by [email protected] 设置监听器只有最后一个添加到HightLightView的knownView响应了事件
//        //优化在布局中声明onClick方法 {@link #clickKnown(view)}响应所有R.id.iv_known的控件的点击事件
//        View decorLayout = mHightLight.getHightLightView();
//        ImageView knownView = (ImageView) decorLayout.findViewById(R.id.iv_known);
//        knownView.setOnClickListener(new View.OnClickListener()
//          {
//            @Override
//            public void onClick(View view) {
//                remove(null);
//            }
//        });
    }

anchor()指你需要在哪个view上加一层透明的蒙版,如果不设置,默认为android.R.id.content。也就是说,该库支持局部范围内去高亮某些View.

addHighLight包含3个参数:

  • 参数1:需要高亮view的id,这个没什么说的

  • 参数2:你的tip布局的layoutId,也就是箭头和文字,你自己编写个布局,参考demo即可。

  • 参数3:是个接口,接口包含一系列的位置信息,如下

     /**
      * @param rightMargin 高亮view在anchor中的右边距
      * @param bottomMargin 高亮view在anchor中的下边距
      * @param rectF 高亮view的l,t,r,b,w,h都有
      * @param marginInfo 设置你的布局的位置,一般设置l,t或者r,b
      */

    哈,提供了一堆的位置信息,但是你要做的,只是去设置leftMargin和topMargin;或者rightMargin和bottomMargin。

    目前看起来,我觉得位置信息够了,当然如果你有想法欢迎提出。

    哈,是不是参数比较多,看着烦,如果你图省事,可以提供一个枚举,提供4个或者8个默认的位置,这个事呢,dota1群@李志云已经完成~认识的话可以去找他。

  • 参数4:高亮形状 抽象类BaseLightShape(dx,dy,blurRadius)

     /**
      * @param dx 水平方向偏移
      * @param dy 垂直方向偏移
      * @param blurRadius 模糊半径 默认15px 0不模糊
      */

    两个抽象方法:

     /**
      * reset RectF for Shape by dx and dy. 根据dx,dy重置viewPosInfoRectF大小
      * @param viewPosInfoRectF
      * @param dx
      * @param dy
      */
     protected abstract void resetRectF4Shape(RectF viewPosInfoRectF, float dx, float dy);
    
     /**
      * draw shape into bitmap. 绘制高亮形状到传递过来的图片画布上
      * @param bitmap
      * @param viewPosInfo
      * @see zhy.com.highlight.view.HightLightView#addViewForEveryTip(HighLight.ViewPosInfo)
      * @see HightLightView#buildMask()
      */
     protected abstract void drawShape(Bitmap bitmap, HighLight.ViewPosInfo viewPosInfo);
    

    BaseLightShape的实现类:RectLightShape(矩形)、CircleLightShape(圆形)、OvalLightShape(椭圆),具体实现请查看代码

Question 问题

  1. 添加的提示布局怎么在屏幕中水平居中显示(垂直居中类似)

    提示布局根布局android:layout_width="match_parent" android:gravity="center_horizontal"

    自定义定位参数rightMargin=0

  2. 怎么针对同一个高亮控件添加多个提示布局

    addHighLight 多次添加 第一个参数使用同一个控件id即可

  3. 高亮布局显示后 底层布局有变化 怎么更新高亮布局

    mHighLight.getHightLightView().requestLayout() 掉用后高亮布局会重新布局及绘制

  4. 页面加载完成,自动显示,应该放在哪里调用?

    v1.8.0及以后版本建议使用setOnLayoutCallback方式 老版本使用下面方案

        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            //界面初始化后显示高亮布局
            mHightLight.show();
        }
        
    	或者:
    	
      	getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        getWindow().getDecorView().getViewTreeObserver()
                                .removeOnGlobalLayoutListener(this);
                    }
                    
    	        	//界面初始化后显示高亮布局
                  	initHightLight();
                  	mHightLight.show();
                }
    
            });	 
    
  5. 如果使用viewpager非第一页高亮布局 有可能定位到屏幕外

    v1.7.2版本已修复 具体方案参考#21

    感谢 @liyanxi 提供的方案 会更新到 README.md

    //自定义高亮形状
    final HighLight.LightShape mLightShape = new BaseLightShape() {
        @Override
        protected void resetRectF4Shape(RectF viewPosInfoRectF, float dx, float dy) {
           //重置viewPosInfoRectF 模掉屏幕宽度 得到真实的left
            viewPosInfoRectF.offsetTo(viewPosInfoRectF.left % DeviceUtil.getScreenDispaly(getActivity())[0], viewPosInfoRectF.top);
        }
      ......
    

Changelog 更改历史

See details in CHANGELOG.md file.

致谢

  • 感谢android day day dota1群,苏苏,提供的图片资源。
  • thx for 李志云@dota1的测试、修改、提议。
  • thx for @zj593743143的测试和建议

highlight's People

Contributors

allen026 avatar hongyangandroid avatar isanwenyu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

highlight's Issues

OOM了

偶尔出现OOM,怎么解,在fragment中使用的

关于高亮消失

洋Man,能不能提供一个开关,点击其他区域不消失。只有用户点击 规定的 按钮才消失。我看了一下源码,发现有个方法是拦截的。intercept;但是 如果被遮罩的是个ListView或者其他可以滑动的控件,还是可以点击或滑动。。因为继承的是Fragmelayout 。。。

如何修改高亮的图形?

可能没说清,比如现在高亮的部分是一个长方形:
如果我想将高亮的部分修改为椭圆形该怎么修改呢?
https://github.com/hongyangAndroid/Highlight/blob/master/highlight2.gif?raw=true

app的mainifest设置allowBackup value=false时,和依赖库的有冲突

Error:(76, 9) Attribute application@allowBackup value=(false) from AndroidManifest.xml:76:9
is also present at com.zhy:highlight:1.1.0:12:9 value=(true)
Suggestion: add 'tools:replace="android:allowBackup"' to element at AndroidManifest.xml:75:5 to override
Error:Execution failed for task ':app:processFYDH_01DebugManifest'.

Manifest merger failed : Attribute application@allowBackup value=(false) from AndroidManifest.xml:76:9
is also present at com.zhy:highlight:1.1.0:12:9 value=(true)
Suggestion: add 'tools:replace="android:allowBackup"' to element at AndroidManifest.xml:75:5 to override

Layout布局冗余的问题

现在的实现机制是,我一个页面要添加蒙板的话,就要创建一个layout布局文件,能不能优化一下就使用一个layout布局文件,动态改变他里边的子控件啊

关于布局

现在的实现方案,假如我的APP里边有5个页面需要添加蒙板,那么我就需要创建5个layout布局文件,然后每个里边放一个ImageView,这样就容易导致资源冗余~希望能改进一下,可以只创建1个layout,然后提供一个方法动态改变图片的资源就行了~~~~

OnBottomPosCallback关于距离底部的问题

我在测试中使用的是OnBottomPosCallback,自定义添加了一个margin_left以适应让图片居左的固定距离,但是设置完成之后,发现在魅族等有虚拟按键的手机上,容易出现图片被虚拟按键栏盖住,,,,也就是在getPosition(float rightMargin, float bottomMargin, RectF rectF, HighLight.MarginInfo marginInfo)这个方法中,marginInfo.leftMargin = leftMargin;
marginInfo.topMargin = rectF.top + rectF.height() + offset;默认的是使用的topMargin来设置我要显示的图片和透明区的距离,那么就导致我下边的图片被虚拟按键栏挡住了。。。。。。。。。这个该怎么解决,,,,求解。。。

问一下在fragment中如何设置

在fragment中设置如下:
mHighLight = new HighLight(getActivity())//
.anchor(view.findViewById(R.id.id_container))
.addHighLight(R.id.vp_pager_f,R.layout.info_main_f,
new OnBottomPosCallback(),new RectLightShape());
mHighLight.show();
mHighLight.setClickCallback(new HighLight.OnClickCallback() {
@OverRide
public void onClick() {
// GCSharePreferenceUtils.putBoolean(getActivity(),IS_SHOW_MAIN_F, false);
}
});

报错为:java.lang.NullPointerException
at common.highlight.HighLight.show(HighLight.java:192)

192行为: parent.removeView(mAnchor);

Bitmap容易出现OOM

mMaskBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Bitmap.Config.ARGB_8888);

maven 插件出现不匹配情况

classpath 'com.github.dcendents:android-maven-plugin:1.2'
这个依赖貌似有点老, 工程导入到我的 AS 环境中出现了 以下错误
Error:(2, 0) Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory
Open File

需要将版本更新到
classpath ‘com.github.dcendents:android-maven-gradle-plugin:1.3’

scrollView报错

如果加入的父布局是ScrollView的话,show()会报错,意思是scrollView只能加入一个子控件,您在判断的时候使用了
if (mAnchor instanceof FrameLayout){ ...}
但是scrollView本身是基础了FrameLayout的,所以应该加上
if ((mAnchor instanceof FrameLayout)&&!(mAnchor instanceof FrameLayout)){ ...}

一些建议

` private void buildMask()
{

//==

  • mMaskBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new
  • Canvas(mMaskBitmap);
    ==//`总觉得这样操作bitmap对象,内存占用还是蛮大的。特别是对于一些低端机型,直接oom,以5.0的坚果手机为例,内存占用70-98M。并且资源有时似乎并没有完全释放掉。我也尝试着用别的方式去实现这个背景画布,但是效果一般。还望鸿洋大神能在性能上帮助我们使用上更好的工具。

圆角按钮的问题

您好,当我使用了一个按钮(设置了圆角背景),这时候,怎么可以设置高亮部分为圆角,谢谢!!!

关于点击那个 我知道按钮 关闭遮照

View decorLayout = mHightLight.getHightLightView();
ImageView knownView = (ImageView) decorLayout.findViewById(R.id.iv_known);
knownView.setOnClickListener(new View.OnClickListener()
{
@OverRide
public void onClick(View view) {
remove(null);
}
});
这个方法执行的时候报错如下:
Could not find a method clickKnown(View) in the activity class com.zhy.highlight.MainActivity for onClick handler on view class android.widget.ImageView with id 'iv_known'

关于remove函数的一些疑问

你好,今天看到了你HightLightView的代码, 其中对于HightLightView进行remove的方法表示不是很理解,感觉和add的时候的逻辑不对应,感觉else处的代码是永远不会得到执行的机会的,通过对附带的demo进行测试也是如此,我认为应该是bug吧

功能建议

当只有一个按钮的时候我希望点击其它地方都灰色无效 ,我需要只对这个按钮生效 ,且监听它的点击事件 现在的情况好像是点击其它灰色地方也自动消失。

点击这个指定高亮按钮可以控制是否消失,点击消失后,我 需要在弹出一个引导,而不是全部给引导出来 。 设计图很变态,是点击这个按钮 之后 然后又在原始界面弹出另外一个 高亮 ,依然只有一个按钮,不是像您demo那样一次把所有需要高亮的区域高亮完 ,

使用中友盟抓到的bug.

java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java)
at java.util.ArrayList.get(ArrayList.java)
at com.dh.lib.view.highLightView.HightLightView.updateTipPos(HightLightView.java)
at com.dh.lib.view.highLightView.HightLightView.onLayout(HightLightView.java)
at android.view.View.layout(View.java)
at android.view.ViewGroup.layout(ViewGroup.java)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java)
at android.widget.FrameLayout.onLayout(FrameLayout.java)
at android.view.View.layout(View.java)
at android.view.ViewGroup.layout(ViewGroup.java)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java)
at android.widget.FrameLayout.onLayout(FrameLayout.java)
at android.view.View.layout(View.java)
at android.view.ViewGroup.layout(ViewGroup.java)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java)
at android.widget.LinearLayout.onLayout(LinearLayout.java)
at android.view.View.layout(View.java)
at android.view.ViewGroup.layout(ViewGroup.java)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java)
at android.widget.FrameLayout.onLayout(FrameLayout.java)
at android.view.View.layout(View.java)
at android.view.ViewGroup.layout(ViewGroup.java)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java)
at android.view.Choreographer.doCallbacks(Choreographer.java)
at android.view.Choreographer.doFrame(Choreographer.java)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java)
at android.os.Handler.handleCallback(Handler.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.app.ActivityThread.main(ActivityThread.java)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)

使用时会类型转换异常 求问

java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v7.internal.widget.ActionBarOverlayLayout$LayoutParams

在某些设备上回出现 NullPointerException

Attempt to invoke virtual method 'boolean android.graphics.Bitmap.isRecycled()' on a null object reference
android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1224)
android.graphics.Canvas.drawBitmap(Canvas.java:1280)
zhy.com.highlight.view.HightLightView.onDraw(HightLightView.java:188)
android.view.View.draw(View.java:15356)
android.widget.FrameLayout.draw(FrameLayout.java:592)
android.view.View.draw(View.java:15264)
android.view.ViewGroup.drawChild(ViewGroup.java:3405)
android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
android.view.View.draw(View.java:15259)
android.view.ViewGroup.drawChild(ViewGroup.java:3405)
android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
android.view.View.draw(View.java:15259)
android.view.ViewGroup.drawChild(ViewGroup.java:3405)
android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
android.view.View.draw(View.java:15359)
android.widget.FrameLayout.draw(FrameLayout.java:592)
com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2597)
com.letv.leui.util.statusbar.StatusbarColorFromTitleHelper.captureScreen(StatusbarColorFromTitleHelper.java:65)
android.app.Activity$2.onWindowFocusChanged(Activity.java:6290)
android.view.ViewTreeObserver.dispatchOnWindowFocusChange(ViewTreeObserver.java:778)
android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3529)
android.os.Handler.dispatchMessage(Handler.java:102)
android.os.Looper.loop(Looper.java:135)
android.app.ActivityThread.main(ActivityThread.java:5314)
java.lang.reflect.Method.invoke(Native Method)
java.lang.reflect.Method.invoke(Method.java:372)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

系统版本号:Android 5.0.2,level 21
设备:X900(乐视手机)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.