android自定义view用path画长方形

这次主要是练习一下Android的自定义view和path的相关使用,所以做了一个简单的demo:自定义一个view,并用path在上面画一个可以动态改变圆角大小的长方形。

自定义相关属性

自定义view首先需要在values文件夹下建一个attrs文件,并在其中定义view的相关属性,如下:

<resources>
  <declare-styleable name="CustomView">
    <attr name="round_position">
      <flag name="left-top" value="0x1"></flag>
      <flag name="right-top" value="0x4"></flag>
      <flag name="left-bottom" value="0x2"></flag>
      <flag name="right-bottom" value="0x8"></flag>
    </attr>
    <attr name="round_radius" format="dimension"></attr>
  </declare-styleable>
</resources>

其中round_position指的是圆角的位置,这里属性类型定为flag(位或运算)这样就可以在布局中同时使用多个属性了,类似于EditText中定义文字样式:android:textStyle="bold|italic";round_radius指圆角大小,类型为dimension。

自定义view类

新建一个类继承View,如下:

public class CustomView extends View {
  private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
  private Path path;
  private int color = Color.GREEN;
  private final int LEFT_TOP = 0x1;
  private final int LEFT_BOTTOM = 0x2;
  private final int RIGHT_TOP = 0x4;
  private final int RIGHT_BOTTOM = 0x8;
  private boolean drawLeftTop;
  private boolean drawLeftBottom;
  private boolean drawRightTop;
  private boolean drawRightBottom;
  private float radius;

  public CustomView(Context context) {
    super(context);
    initDraw();
  }

  public CustomView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
    int position = typedArray.getInt(R.styleable.CustomView_round_position, 0);
    radius = typedArray.getDimension(R.styleable.CustomView_round_radius, 0);
    drawLeftTop = (position & LEFT_TOP) == LEFT_TOP;
    drawLeftBottom = (position & LEFT_BOTTOM) == LEFT_BOTTOM;
    drawRightTop = (position & RIGHT_TOP) == RIGHT_TOP;
    drawRightBottom = (position & RIGHT_BOTTOM) == RIGHT_BOTTOM;
    typedArray.recycle();
    initDraw();
  }

  public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initDraw();
  }

  private void initDraw() {
    path = new Path();
    paint.setColor(Color.GREEN);
    paint.setAntiAlias(true);
    paint.setStrokeWidth((float) 5);
    paint.setStyle(Paint.Style.STROKE);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    path.reset();//这里很重要,如果不写这一行,则每次重绘view后先前绘制的还会存在
    path.moveTo(radius, 0);
    if (drawRightTop) {
      path.lineTo(getWidth() - radius, 0);
//      path.cubicTo(radius + getWidth() / 3, 0, radius + getWidth() / 3 * 2, 0, getWidth() - radius, 0);
      path.cubicTo(getWidth() - radius / 2, 0, getWidth(), radius / 2, getWidth(), radius);
    } else {
      path.lineTo(getWidth(), 0);
//      path.cubicTo(radius + getWidth() / 3, 0, radius + getWidth() / 3 * 2, 0, getWidth(), 0);
    }
    path.lineTo(getWidth(), getHeight() - radius);
//    path.cubicTo(getWidth(), radius + getHeight() / 3, getWidth(), radius + getHeight() / 3 * 2, getWidth(), getHeight() - radius);
    if (drawRightBottom) {
      path.cubicTo(getWidth(), getHeight() - radius / 2, getWidth() - radius / 2, getHeight(), getWidth() - radius, getHeight());
    } else {
      path.lineTo(getWidth(), getHeight());
    }
    path.lineTo(radius, getHeight());
    if (drawLeftBottom) {
      path.cubicTo(radius / 2, getHeight(), 0, getHeight() - radius / 2, 0, getHeight() - radius);
    } else {
      path.lineTo(0, getHeight());
    }
    path.lineTo(0, radius);
    if (drawLeftTop) {
      path.cubicTo(0, radius / 2, radius / 2, 0, radius, 0);
    } else {
      path.lineTo(0, 0);
      path.lineTo(radius, 0);
    }
    canvas.drawPath(path, paint);
    super.onDraw(canvas);
  }

  public void setRadius(float radius) {
    this.radius = radius;
  }

  public void refreshView() {
    invalidate();
  }
}

这里使用了path和贝塞尔曲线的绘制方法来绘制可动态调整圆角大小的长方形,注意每次重绘时要先调用path.reset()清除之前绘制的path,然后再绘制新的path,不然旧的path还会一直存在。

布局中使用自定义view

<wjc.myrecyclerview.CustomView
    android:id="@+id/custom_view"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_margin="100dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:round_position="left-bottom|right-bottom|right-top|left-top" />

这样就完成了一个简单的自定义可调整圆角的长方形,在MainActivity中进行动态控制:

view.setRadius(progress);
view.refreshView();

实现的最终效果

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

(0)

相关推荐

  • android开发之方形圆角listview代码分享

    先看效果图: 首先,你得写一个类我们命名为CornerListView [java] 复制代码 代码如下: /** * 圆角ListView示例 * @Description: 圆角ListView示例 * @FileName: CornerListView.java  */ public class CornerListView extends ListView {     public CornerListView(Context context) {         super(conte

  • android自定义view用path画长方形

    这次主要是练习一下Android的自定义view和path的相关使用,所以做了一个简单的demo:自定义一个view,并用path在上面画一个可以动态改变圆角大小的长方形. 自定义相关属性 自定义view首先需要在values文件夹下建一个attrs文件,并在其中定义view的相关属性,如下: <resources> <declare-styleable name="CustomView"> <attr name="round_position&

  • Android自定义View实现支付宝支付成功-极速get花式Path炫酷动画

    本文手把手教你图片->SVG->Path的姿势.. 从此酷炫Path动画,如此简单. 效果先随便上几个图,以后你找到的图有多精彩,gif就有多精彩: 随便搜了一个铅笔画的图,丢进去 随手复制的二维码icon 来自大佬wing的铁塔 前文回顾 这里简单回顾一下前文,GIF如下图: PathAnimView接受的唯一数据源是Path(给我一个Path,还你一个动画View) 所以内置了几种将别的资源->Path的方法: 直接传string.(A-Z,0-9 "." &qu

  • Android自定义View画圆功能

    本文实例为大家分享了Android自定义View画圆的具体代码,供大家参考,具体内容如下 引入布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&q

  • Android自定义View图片按Path运动和旋转

    本文实例为大家分享了Android自定义View图片按Path运动旋转的具体代码,供大家参考,具体内容如下 View: /** * author : stone * email : aa86799@163.com * time : 16/5/29 15 29 */ public class EarthPathView extends View { private Path mPath; private Paint mPaint; private Bitmap mBitmap; private P

  • Android自定义view实现阻尼效果的加载动画

    效果: 需要知识: 1. 二次贝塞尔曲线 2. 动画知识 3. 基础自定义view知识 先来解释下什么叫阻尼运动 阻尼振动是指,由于振动系统受到摩擦和介质阻力或其他能耗而使振幅随时间逐渐衰减的振动,又称减幅振动.衰减振动.[1] 不论是弹簧振子还是单摆由于外界的摩擦和介质阻力总是存在,在振动过程中要不断克服外界阻力做功,消耗能量,振幅就会逐渐减小,经过一段时间,振动就会完全停下来.这种振幅随时间减小的振动称为阻尼振动.因为振幅与振动的能量有关,阻尼振动也就是能量不断减少的振动.阻尼振动是非简谐运

  • Android自定义View实现照片裁剪框与照片裁剪功能

    本文所需要实现的就是这样一种有逼格的效果: 右上角加了个图片框,按下确定可以裁剪正方形区域里的图片并显示在右上角. 实现思路: 1:首先需要自定义一个ZoomImageView来显示我们需要的图片,这个View需要让图片能够以合适的位置展现在当前布局的图片展示区域内(合适的位置值的是:如果图片长度大于屏幕,则压缩图片长度至屏幕宽度,高度等比压缩并居中显示,如果图片高度大于屏幕,则压缩图片高度至屏幕高度,长度等比压缩并居中显示.): 2:然后需要实现这个拖动的框框,该框框实现的功能有四点:拖动.扩

  • Android自定义view 你所需要知道的基本函数总结

    Android自定义view 你所需要知道的基本函数 首先 往Canvas上面draw需要一个Paint. 画笔常用的函数有哪些呢.由于木有调试环境,函数基本上默写,有错请评论提出,蟹蟹! Paint p = new Paint(); //设置画笔的颜色 p.setColor(Color.parseColor("#2EA4F2")); //设置画笔的风格:全部填充FILL 只画轮廓STROKE p.setStyle(Paint.Style.STROKE); //设置画笔的宽度 p.se

  • Android自定义View 实现水波纹动画引导效果

    一.实现效果图 二.实现代码 1.自定义view package com.czhappy.showintroduce.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Pat

  • Android自定义View之圆形进度条式按钮

    介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图. 和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态.而且他说圆形进度的功能已经实现了.那么我们只需要对中间的两个状态做处理就行了. 先来看看实现的效果图: 上面说了我们只需要处理中间状态的变化就可以了,对于进度的处理直接使用了弘洋文章中实现: http://blog.csdn.net/lmj623565791/article/details/43371299 下面开始具体实现. 具体实

  • Android自定义View实现带数字的进度条实例代码

    第一步.效果展示 图1.蓝色的进度条 图2.红色的进度条 图3.多条颜色不同的进度条 图4.多条颜色不同的进度条 第二步.自定义ProgressBar实现带数字的进度条 0.项目结构 如上图所示:library项目为自定义的带数字的进度条NumberProgressBar的具体实现,demo项目为示例项目以工程依赖的方式引用library项目,然后使用自定义的带数字的进度条NumberProgressBar来做展示 如上图所示:自定义的带数字的进度条的library项目的结构图 如上图所示:de

随机推荐