国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

android自定義view用path畫(huà)長(zhǎng)方形

瀏覽:107日期:2022-09-25 08:53:03

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

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

自定義view首先需要在values文件夾下建一個(gè)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指的是圓角的位置,這里屬性類(lèi)型定為flag(位或運(yùn)算)這樣就可以在布局中同時(shí)使用多個(gè)屬性了,類(lèi)似于EditText中定義文字樣式:android:textStyle='bold|italic';round_radius指圓角大小,類(lèi)型為dimension。

自定義view類(lèi)

新建一個(gè)類(lèi)繼承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();//這里很重要,如果不寫(xiě)這一行,則每次重繪view后先前繪制的還會(huì)存在 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和貝塞爾曲線的繪制方法來(lái)繪制可動(dòng)態(tài)調(diào)整圓角大小的長(zhǎng)方形,注意每次重繪時(shí)要先調(diào)用path.reset()清除之前繪制的path,然后再繪制新的path,不然舊的path還會(huì)一直存在。

布局中使用自定義view

<wjc.myrecyclerview.CustomView android: 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' />

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

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

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

android自定義view用path畫(huà)長(zhǎng)方形

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 久久久久久久国产精品影院 | 久草新免费 | 亚洲加勒比在线 | 国产日韩精品一区二区三区 | 国产精品日产三级在线观看 | 久久精品国产亚洲 | 干综合网 | 国产三香港三韩国三级不卡 | 亚洲国产精品久久卡一 | 成人香蕉视频 | 日本暖暖在线视频 | 亚洲免费毛片 | 欧美日韩 在线播放 | 最新色网址 | 久久久久久91精品色婷婷 | 一级在线免费视频 | 亚洲第一男人天堂 | 香港三澳门三日本三级 | 老头巨大粗长xxxxx | 亚洲成人黄色网 | 久草在线国产 | 长腿嫩模打开双腿呻吟 | 亚洲精品成人久久久影院 | 国内精品久久久久久久aa护士 | 亚洲天堂爱爱 | 欧美一级视频在线观看欧美 | 99视频九九精品视频在线观看 | 国产经典一区 | 男人添女人下面免费毛片 | 1717she国产精品免费视频 | 很黄很色的摸下面的视频 | 国产视频一二三 | 国产精品自在自线亚洲 | 91人成亚洲高清在线观看 | 一级毛片免费不卡在线 | 亚洲国内精品 | 欧美日韩成人在线视频 | 日韩不卡一区二区 | 中文字幕一级 | 97超频国产在线公开免费视频 | 一级欧美一级日韩毛片99 |