中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

android如何自定義view用path畫長方形

這篇文章給大家分享的是有關(guān)android如何自定義view用path畫長方形的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了貴南免費(fèi)建站歡迎大家使用!

Android是什么

Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機(jī)和平板電腦,由美國Google公司和開放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。

這次主要是練習(xí)一下Android的自定義view和path的相關(guān)使用,所以做了一個簡單的demo:自定義一個view,并用path在上面畫一個可以動態(tài)改變圓角大小的長方形。

自定義相關(guān)屬性

自定義view首先需要在values文件夾下建一個attrs文件,并在其中定義view的相關(guān)屬性,如下:

<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(位或運(yùn)算)這樣就可以在布局中同時使用多個屬性了,類似于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和貝塞爾曲線的繪制方法來繪制可動態(tài)調(diào)整圓角大小的長方形,注意每次重繪時要先調(diào)用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" />

這樣就完成了一個簡單的自定義可調(diào)整圓角的長方形,在MainActivity中進(jìn)行動態(tài)控制:

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

實(shí)現(xiàn)的最終效果

android如何自定義view用path畫長方形

感謝各位的閱讀!關(guān)于“android如何自定義view用path畫長方形”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

當(dāng)前標(biāo)題:android如何自定義view用path畫長方形
轉(zhuǎn)載來源:http://www.rwnh.cn/article40/gopjeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、做網(wǎng)站、微信公眾號、網(wǎng)站設(shè)計、App設(shè)計、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
灵川县| 东阿县| 临朐县| 洞口县| 尉犁县| 拜城县| 洪泽县| 寻甸| 宽城| 车致| 桦甸市| 明水县| 亚东县| 灌阳县| 沙雅县| 古丈县| 漳平市| 昭通市| 迁西县| 鸡东县| 宣恩县| 会昌县| 璧山县| 祥云县| 五台县| 望江县| 修文县| 元江| 阿尔山市| 海伦市| 温宿县| 禄劝| 从化市| 呼和浩特市| 天台县| 通州市| 安乡县| 固始县| 张家港市| 庐江县| 靖江市|