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实现闪屏欢迎界面

    Android实现闪屏欢迎界面

    这篇文章主要介绍了Android实现闪屏欢迎界面的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • 浅谈Android中Drawable使用知识总结

    浅谈Android中Drawable使用知识总结

    本篇文章主要介绍了浅谈Android中Drawable使用知识总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Android实现图片的高斯模糊(两种方式)

    Android实现图片的高斯模糊(两种方式)

    本文给大家分享两种实现图片的高斯模糊效果,非常不错,具有参考借鉴价值,对android图片高斯模糊效果感兴趣的朋友一起看看吧
    2017-03-03
  • Android中通过view方式获取当前Activity的屏幕截图实现方法

    Android中通过view方式获取当前Activity的屏幕截图实现方法

    这篇文章主要介绍了Android中通过view方式获取当前Activity的屏幕截图实现方法,本文方法相对简单,容易理解,需要的朋友可以参考下
    2014-09-09
  • Android实现图片九宫格

    Android实现图片九宫格

    这篇文章主要为大家详细介绍了Android实现图片九宫格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Android自定义圆环式进度条

    Android自定义圆环式进度条

    这篇文章主要为大家详细介绍了Android自定义圆环式进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Android 监听应用前/后台切换实例代码

    Android 监听应用前/后台切换实例代码

    本篇文章主要介绍了Android 监听应用前/后台切换实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Android自定义View之组合控件实现类似电商app顶部栏

    Android自定义View之组合控件实现类似电商app顶部栏

    这篇文章主要为大家详细介绍了Android自定义View之组合控件,实现类似电商app顶部栏的相关资料,具有参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Android编程开发之Spinner组件用法

    Android编程开发之Spinner组件用法

    这篇文章主要介绍了Android编程开发之Spinner组件用法,结合实例形式分析介绍了Android中Spinner组件的功能、定义及具体使用技巧,需要的朋友可以参考下
    2015-12-12
  • Android 中不用线程如何实现倒计时

    Android 中不用线程如何实现倒计时

    本文给大家分享android中不用线程如何实现倒计时功能,非常不错,具有参考借鉴价值,需要的朋友参考下
    2017-01-01

最新评论