Android高亮引导控件的实现代码

 更新时间:2018年07月11日 09:08:30   作者:Wang_Yi  
这篇文章主要介绍了Android高亮引导控件的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

最近项目需求是实现高亮功能引导页的效果,查了很多资料Android确实没有类似iOS的抠图的现成控件,就自己写一个,具体如下:

Demo

代码

public class HighLightLayout extends FrameLayout {
  private Paint mPaint;
  private Path mPath = new Path();
  private List<RectRegion> mRegions;

  public HighLightLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setColor(0xAA000000);

    setWillNotDraw(false);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    mPath.reset();
    mPath.addRect(0, 0, getWidth(), getHeight(), Path.Direction.CCW);
    for (RectRegion region : mRegions) {
      RectF rectF = region.rectF;
      if (region instanceof RoundRectRegion) {
        RoundRectRegion roundRectRegion = (RoundRectRegion) region;
        mPath.addRoundRect(rectF, roundRectRegion.rx, roundRectRegion.ry,               Path.Direction.CW);
      } else if (region instanceof CircleRegion) {
        CircleRegion circleRegion = (CircleRegion) region;
        float cX = (rectF.right + rectF.left) / 2;
        float cY = (rectF.bottom + rectF.top) / 2;
        mPath.addCircle(cX, cY, circleRegion.radius, Path.Direction.CW);
      } else if (region instanceof OvalRegion) {
        mPath.addOval(rectF, Path.Direction.CW);
      } else {
        mPath.addRect(rectF, Path.Direction.CW);
      }
    }
    canvas.drawPath(mPath, mPaint);
  }

  public void setRegion(@NonNull RectRegion region) {
    if (mRegions == null) {
      mRegions = new ArrayList<>();
    } else {
      mRegions.clear();
    }
    mRegions.add(region);
    invalidate();
  }

  public void setRegions(@NonNull List<RectRegion> regions) {
    mRegions = regions;
    invalidate();
  }

  @Override
  public void setBackgroundColor(int color) {
    mPaint.setColor(color);
  }
}

HighLightLayout继承自FrameLayout,重写了 onDraw 方法来实现高亮区域的绘制; setRegion 设置一个高亮区域, setRegions 设置多个高亮区域;重写 setBackgroundColor 来实现设置高亮背景色。

Region表示了一个高亮矩形区域,支持4种高亮类型,

RectRegion 矩形高亮区域

public class RectRegion implements Parcelable {
  public RectF rectF;
  //... Parcelable实现代码
}

RoundRectRegion 圆角矩形高亮区域

public class RoundRectRegion extends RectRegion {
  public float rx, ry;
  //... Parcelable实现代码
}

CircleRegion 圆形高亮区域

public class CircleRegion extends RectRegion {
  public float radius;
  //... Parcelable实现代码
}

OvalRegion 椭圆高亮区域

public class OvalRegion extends RectRegion {
  //... Parcelable实现代码
}

使用

创建一个GuideActivity,该Activity根布局是一个HighLightLayout,可以在HighLightLayout中添加任何控件

<wangyi.blog.app.view.HighLightLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/highLightLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".GuideActivity">
</wangyi.blog.app.view.HighLightLayout>

启动GuideActivity 并传递需要高亮显示的区域

ArrayList<RectRegion> regions = new ArrayList<>();

    //矩形高亮
    RectF rectF1 = LocationUtils.getViewLocation(mButton1);
    RectRegion region1 = new RectRegion(rectF1);
    regions.add(region1);
    //圆角矩形高亮
    RectF rectF2 = LocationUtils.getViewLocation(mButton2);
    RoundRectRegion region2 = new RoundRectRegion(rectF2, 10, 10);
    regions.add(region2);
    //圆形高亮
    RectF rectF3 = LocationUtils.getViewLocation(mButton3);
    float radius = (rectF3.right - rectF3.left) / 2 + 20;
    CircleRegion region3 = new CircleRegion(rectF3, radius);
    regions.add(region3);
    //椭圆高亮
    RectF rectF4 = LocationUtils.getViewLocation(mButton4);
    LocationUtils.expandRectF(rectF4, 40);
    OvalRegion region4 = new OvalRegion(rectF4);
    regions.add(region4);

    Intent intent = new Intent(this, GuideActivity.class);
    intent.putExtra(GuideActivity.EXTRA_REGION_LIST, regions);
    startActivity(intent);

GuideActivity的onCreate中设置高亮区域

ArrayList<RectRegion> regions = getIntent().getParcelableArrayListExtra(EXTRA_REGION_LIST);
    HighLightLayout highLightLayout = findViewById(R.id.highLightLayout);
    highLightLayout.setRegions(regions);

Github

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android Service总结及详细介绍

    Android Service总结及详细介绍

    本文主要介绍Android Service的知识,这里整理了详细资料及简单实现示例代码,有需要的小伙伴可以参考下
    2016-09-09
  • 解决AndroidStudio无法运行java中的mian方法问题

    解决AndroidStudio无法运行java中的mian方法问题

    这篇文章主要介绍了解决AndroidStudio无法运行java中的mian方法问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Android 实现图片模糊、高斯模糊、毛玻璃效果的三种方法

    Android 实现图片模糊、高斯模糊、毛玻璃效果的三种方法

    在前几天写过一个使用glide-transformations的方法实现高斯模糊的方法,今天偶然间有发现一个大神写的另一个方法,感觉挺不错的,分享一下
    2016-12-12
  • Android实现注册页面(携带数据包跳转)

    Android实现注册页面(携带数据包跳转)

    这篇文章主要为大家详细介绍了Android实现注册页面,点击注册按钮跳转到另一个页面并显示输入信息,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Android实现整理PackageManager获取所有安装程序信息

    Android实现整理PackageManager获取所有安装程序信息

    这篇文章主要介绍了Android实现整理PackageManager获取所有安装程序信息的方法,实例分析了Android使用PackageManager获取安装程序信息的具体步骤与相关技巧,需要的朋友可以参考下
    2016-01-01
  • Android 自定义标题栏的实例详解

    Android 自定义标题栏的实例详解

    这篇文章主要介绍了 Android 自定义标题栏的实例详解的相关资料,希望通过本文能帮助到大家,让大家实现这样类似的功能,需要的朋友可以参考下
    2017-10-10
  • 详谈Android中Matrix的set、pre、post的区别

    详谈Android中Matrix的set、pre、post的区别

    下面小编就为大家带来一篇详谈Android中Matrix的set、pre、post的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Android Material加载进度条制作代码

    Android Material加载进度条制作代码

    这篇文章主要为大家详细介绍了AndroidMaterial加载进度条的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • 深入解析Android中View创建的全过程

    深入解析Android中View创建的全过程

    这篇文章主要给大家深入的解析了关于Android中View创建的全过程,文中介绍的非常详细,相信对大家会有一定的参考借鉴,需要的朋友们下面来一起学习学习吧。
    2017-03-03
  • Android编程之防止反编译的实现方法

    Android编程之防止反编译的实现方法

    这篇文章主要介绍了Android编程之防止反编译的实现方法,涉及Android针对运行环境、签名及程序相关信息的获取与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11

最新评论