日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Android自定義控件實(shí)現(xiàn)時(shí)間軸

瀏覽:19日期:2022-09-19 09:00:10

本文實(shí)例為大家分享了Android自定義控件實(shí)現(xiàn)時(shí)間軸的具體代碼,供大家參考,具體內(nèi)容如下

由于項(xiàng)目中有需求,就簡(jiǎn)單的封裝一個(gè),先記錄一下,有時(shí)間上傳到github。

1、先增加自定義屬性:

<?xml version='1.0' encoding='utf-8'?><resources> <declare-styleable name='global_TimelineLayout'><!--時(shí)間軸左偏移值--><attr name='global_line_margin_left' format='dimension' /><!--時(shí)間軸上偏移值--><attr name='global_line_margin_top' format='dimension' /><!--線寬--><attr name='global_line_stroke_width' format='dimension' /><!--線的顏色--><attr name='global_line_color' format='color' /><!--點(diǎn)的大小--><attr name='global_point_inner_size' format='dimension' /><attr name='global_point_out_size' format='dimension' /><!--點(diǎn)的上偏移值--><attr name='global_point_margin_top' format='dimension' /><!--點(diǎn)的顏色--><attr name='global_point_inner_color' format='color' /><attr name='global_point_out_color' format='color' /><!--圖標(biāo)--><attr name='global_icon_src' format='reference' /><!--虛線--><attr name='global_dash_gap' format='dimension' /><attr name='global_dash_width' format='dimension' /> </declare-styleable></resources>

2、自定義時(shí)間軸類:

/** * 時(shí)間軸控件 * <p>The following snippet shows how to include a linear layout in your layout XML file:</p> * * <com.taoche.mars.commonres.widget.TimelineLayout android: android:layout_width='40dp' android:layout_height='match_parent' app:global_line_margin_left='10dp' app:global_line_margin_top='0dp' app:global_point_margin_top='10dp' app:global_point_inner_color='#377CFF' app:global_point_out_color='#FFE8F0FF' app:global_point_out_size='8dp' app:global_point_inner_size='4dp' app:global_dash_width='8dp' app:global_dash_gap='2dp' app:global_line_color='#C9DCFF'> </com.taoche.mars.commonres.widget.TimelineLayout> * * <p>The following snippet shows how to java file:</p> * timelineLayout.setPointMarginTop(10) timelineLayout.setLineMarginTop(10) timelineLayout.setPointMarginTop(40) timelineLayout.setInterrupt(true) */class TimeLinearLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : LinearLayout(context, attrs, defStyleAttr) { private var mContext: Context? = null private var mLineMarginLeft: Int = 10 private var mLineMarginTop: Int = 0 private var mPointMarginTop: Int = 0 private var mLineStrokeWidth: Int = 2 private var mLineColor: Int = 0 //內(nèi)圓半徑 private var mPointInnerSize: Int = 8 //外圓半徑 private var mPointOutSize: Int = 18 //內(nèi)圓顏色 private var mPointInnerColor: Int = 0 //外圓顏色 private var mPointOutColor: Int = 0 //虛線寬 private var mDashWidth: Int = 0 //虛線空白寬 private var mDashGap: Int = 0 //是否中斷 private var mInterrupt: Boolean = false private var mIcon: Bitmap? = null //線的畫筆 private var mLinePaint: Paint? = null //點(diǎn)的畫筆 private var mPointPaint: Paint? = null //第一個(gè)點(diǎn)的位置 private var mFirstX = 0 private var mFirstY = 0 //最后一個(gè)圖標(biāo)的位置 private var mLastX = 0 private var mLastY = 0 init {setLayerType(View.LAYER_TYPE_SOFTWARE, null) //開啟硬件加速val ta = context.obtainStyledAttributes(attrs, R.styleable.global_TimelineLayout)mLineMarginLeft = ta.getDimensionPixelOffset(R.styleable.global_TimelineLayout_global_line_margin_left, 10)mLineMarginTop = ta.getDimensionPixelOffset(R.styleable.global_TimelineLayout_global_line_margin_top, 0)mPointMarginTop = ta.getDimensionPixelOffset(R.styleable.global_TimelineLayout_global_point_margin_top, 0)mLineStrokeWidth = ta.getDimensionPixelOffset(R.styleable.global_TimelineLayout_global_line_stroke_width, 2)mLineColor = ta.getColor(R.styleable.global_TimelineLayout_global_line_color, -0xc22e5b)mPointInnerSize = ta.getDimensionPixelSize(R.styleable.global_TimelineLayout_global_point_inner_size, 8)mPointOutSize = ta.getDimensionPixelSize(R.styleable.global_TimelineLayout_global_point_out_size, 18)mPointInnerColor = ta.getColor(R.styleable.global_TimelineLayout_global_point_inner_color, -0xc22e5b)mPointOutColor = ta.getColor(R.styleable.global_TimelineLayout_global_point_out_color, -0x170f01)mDashGap = ta.getDimensionPixelOffset(R.styleable.global_TimelineLayout_global_dash_gap, 0)mDashWidth = ta.getDimensionPixelOffset(R.styleable.global_TimelineLayout_global_dash_width, 0)val iconRes = ta.getResourceId(R.styleable.global_TimelineLayout_global_icon_src, View.NO_ID)if (iconRes > View.NO_ID) { val drawable = ContextCompat.getDrawable(context,iconRes) as? BitmapDrawable if (drawable != null) {mIcon = drawable.bitmap }}ta.recycle()setWillNotDraw(false)initView(context) } fun setLineMarginTop(lineMarginTop:Int){this.mLineMarginTop = lineMarginTop } fun setPointMarginTop(pointMarginTop:Int){this.mPointMarginTop = pointMarginTop } fun setInterrupt(interrupt:Boolean){this.mInterrupt = interrupt } private fun initView(context: Context) {mContext = contextmLinePaint = Paint()mLinePaint?.apply { isAntiAlias = true isDither = true color = mLineColor strokeWidth = mLineStrokeWidth.toFloat() style = Paint.Style.FILL_AND_STROKE //虛線設(shè)置 if (mDashGap > 0 && mDashWidth > 0) {//mLinePaint.setPathEffect(new DashPathEffect(new float[]{20,5}, 20));pathEffect = DashPathEffect(floatArrayOf(mDashWidth.toFloat(), mDashGap.toFloat()), mDashWidth.toFloat()) }} mPointPaint = Paint()mPointPaint?.apply { isAntiAlias = true isDither = true color = mPointInnerColor style = Paint.Style.FILL} } override fun onDraw(canvas: Canvas) {super.onDraw(canvas)drawTimeline(canvas) } private fun drawTimeline(canvas: Canvas) {drawBetweenLine(canvas)drawFirstPoint(canvas)drawLastIcon(canvas) } private fun drawFirstPoint(canvas: Canvas) {val top = topmFirstX = paddingLeft + mLineMarginLeft + max(mPointOutSize, mPointInnerSize)mFirstY = top + paddingTop + mPointMarginTop + max(mPointOutSize, mPointInnerSize) //畫圓外環(huán)mPointPaint?.color = mPointOutColorcanvas.drawCircle(mFirstX.toFloat(), mFirstY.toFloat(), mPointOutSize.toFloat(), mPointPaint)//畫圓內(nèi)環(huán)mPointPaint?.color = mPointInnerColorcanvas.drawCircle(mFirstX.toFloat(), mFirstY.toFloat(), mPointInnerSize.toFloat(), mPointPaint) } private fun drawLastIcon(canvas: Canvas) {/*if (child != null) { int top = child.getTop(); mLastX = mLineMarginLeft; mLastY = top + child.getPaddingTop() + mLineMarginTop; //畫圖 canvas.drawBitmap(mIcon, mLastX - (mIcon.getWidth() >> 1), mLastY, null);}*/val top = topmLastX = mLineMarginLeft + paddingLeftmLastY = top + paddingTop + mLineMarginTop //畫圖if (mIcon != null) { canvas.drawBitmap(mIcon, mLastX - (mIcon!!.width shr 1).toFloat(), height - mIcon!!.height.toFloat(), null)} } private fun drawBetweenLine(canvas: Canvas) {val top = topmFirstX = paddingLeft + mLineMarginLeft + max(mPointOutSize, mPointInnerSize)mFirstY = top + paddingTop + mLineMarginTopmLastX = paddingLeft + mLineMarginLeft + max(mPointOutSize, mPointInnerSize)mLastY = if(!mInterrupt) {top + paddingTop + mLineMarginTop + height} else mPointMarginTop //從開始的點(diǎn)到最后的圖標(biāo)之間,畫一條線canvas.drawLine(mFirstX.toFloat(), mFirstY.toFloat(), mLastX.toFloat(), mLastY.toFloat(), mLinePaint)//畫圓//val y = top + paddingTop + mLineMarginTop + mPointInnerSize//canvas.drawCircle(mFirstX, y, mPointSize, mPointPaint); } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)val mode = MeasureSpec.getMode(widthMeasureSpec)var measuredWidth = MeasureSpec.getSize(widthMeasureSpec)val measuredHeight = MeasureSpec.getSize(heightMeasureSpec)if (mode == MeasureSpec.AT_MOST) { measuredWidth = paddingLeft + mLineMarginLeft + max(mPointOutSize, mPointInnerSize) * 2}setMeasuredDimension(measuredWidth, measuredHeight) }}

布局中可以直接引用,如下:

<com.example.demo1224.TimelineLayoutandroid:layout_width='wrap_content'android:layout_height='match_parent'app:line_margin_left='25dp'app:line_margin_top='0dp'app:point_margin_top='10dp'app:point_inner_color='#377CFF'app:point_out_color='#FFE8F0FF'app:point_out_size='8dp'app:point_inner_size='4dp'app:dash_width='8dp'app:dash_gap='2dp'app:line_color='#C9DCFF'android:orientation='vertical'android:background='@android:color/white'> </com.example.demo1224.TimelineLayout>

也可以在代碼里面動(dòng)態(tài)設(shè)置相關(guān)屬性(相關(guān)屬性注釋,在自定義屬性時(shí)有說明):

timelineLayout.setPointMarginTop(10) timelineLayout.setLineMarginTop(10) timelineLayout.setPointMarginTop(40) timelineLayout.setInterrupt(true)

僅供大家參考!

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

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
人人香蕉久久| 日本不卡高清| 国产精品亚洲综合在线观看| 亚洲影视一区| 在线精品亚洲| 91精品丝袜国产高跟在线| 亚洲ww精品| 国产亚洲综合精品| 亚洲精品激情| 欧美日韩午夜电影网| 国产精品白丝久久av网站| 精品欠久久久中文字幕加勒比| 91一区二区| 亚洲国产专区| 亚洲在线久久| 国产一区二区三区视频在线| 欧美成人午夜| 日韩亚洲精品在线观看| 国产精品毛片视频| 久久精品青草| 日韩欧美2区| 98精品视频| 欧美精品一线| 国产精品中文字幕亚洲欧美 | 日本中文字幕不卡| 美女毛片一区二区三区四区最新中文字幕亚洲| 美女av一区| 午夜国产一区二区| 国产日韩中文在线中文字幕| 青青青免费在线视频| 男人操女人的视频在线观看欧美| 久久不见久久见免费视频7| 色婷婷狠狠五月综合天色拍| 日本不卡一区二区三区| 日韩欧美一区二区三区在线视频| 国产亚洲精品久久久久婷婷瑜伽| 日本精品一区二区三区在线观看视频| 国产精品hd| 久久福利一区| 国产超碰精品| 国产精品香蕉| 日韩在线黄色| 免费不卡在线视频| 欧美另类专区| 欧美一区久久久| 国产精品www994| 亚洲精品在线国产| 久久亚洲美女| 一区二区视频欧美| 久久人人88| 久久久久久免费视频| 国产无遮挡裸体免费久久| 香蕉久久夜色精品国产| 99国产精品免费视频观看| 91视频一区| 高潮一区二区| se01亚洲视频| 日韩欧美自拍| 欧美日一区二区| 婷婷成人在线| 午夜日韩福利| 亚洲一区二区三区高清不卡| 久久三级视频| 女主播福利一区| 一区二区视频欧美| 亚洲一区二区三区在线免费| 日韩视频在线一区二区三区 | 亚洲一级大片| 亚州精品视频| 欧美一区自拍| 精品视频在线一区二区在线| 色在线中文字幕| 亚洲成人三区| 最新日韩欧美| 欧美精品中文字幕亚洲专区| 国产精品久久久久77777丨| 日本一二区不卡| 欧美成人日韩| 欧美一区91| 国产精品蜜芽在线观看| 欧美亚洲国产精品久久| 水野朝阳av一区二区三区| 视频一区视频二区中文| 国产亚洲观看| 精品亚洲美女网站| 日韩三级一区| 欧美成人基地| 日韩精品导航| 国产精品chinese| 亚洲香蕉网站| 18国产精品| 激情久久五月| 久久影院资源站| 日韩中文字幕区一区有砖一区| 你懂的亚洲视频| 丝袜a∨在线一区二区三区不卡| 久久精品系列| 午夜天堂精品久久久久| 免费看av不卡| 欧美日本二区| 日韩午夜高潮| 国产精品蜜芽在线观看| 欧美亚洲tv| 国产综合视频| 成人污污视频| 日韩国产欧美三级| 水蜜桃久久夜色精品一区的特点| 国产拍在线视频| 免费一区二区三区在线视频| 日韩中文字幕| 日韩精品一二区| 欧美日韩国产探花| 日韩精品影视| 91综合网人人| 成人午夜在线| 嫩草伊人久久精品少妇av杨幂| 亚洲综合福利| 亚洲在线电影| 亚洲福利专区| 久久久777| 91麻豆国产自产在线观看亚洲| 国产欧美日韩影院| 日本亚洲欧美天堂免费| 中文字幕亚洲在线观看| 精品欧美久久| 自由日本语亚洲人高潮| 久久精品播放| 亚洲高清二区| 国产免费成人| 日韩一区二区三区在线看| 日韩中文字幕| 国产精品免费精品自在线观看| 国产美女久久| 国产日韩在线观看视频| 国产精品任我爽爆在线播放 | 一区二区电影在线观看| 亚洲涩涩av| 69堂免费精品视频在线播放| 91大神在线观看线路一区| 久久狠狠久久| 国产精品黑丝在线播放| 高清久久精品| 亚洲欧洲日本mm| 久久aⅴ国产紧身牛仔裤| 综合激情在线| 久久久久亚洲精品中文字幕| 久久精品亚洲| 欧美日韩精品在线一区| 国产女优一区| 国产免费av国片精品草莓男男| 精品国产亚洲一区二区在线观看| 亚洲精品88| 亚洲久草在线| 精品九九在线| 日韩精品一二三区| 国产成人久久精品一区二区三区| 日韩av一级| 亚洲精品在线二区| 国产精品嫩模av在线| 福利欧美精品在线| 日本在线一区二区三区| 国产aa精品| 日韩在线麻豆| 一区二区小说| 久久精品一区二区国产| 免费高清在线一区| 日韩精品1区| 青草国产精品久久久久久| 丝袜美腿诱惑一区二区三区| 亚洲另类黄色| 欧美精品一卡| 水蜜桃久久夜色精品一区| 日韩精品免费视频人成 | 日韩中出av| 午夜精品网站| 日韩在线精品| 国产美女精品视频免费播放软件| 欧美91视频| 精品久久一区| 你懂的国产精品永久在线| 免费在线观看日韩欧美| 日韩精品欧美激情一区二区| 精品一区二区三区的国产在线观看| 快she精品国产999| 久久精品国产www456c0m| bbw在线视频| 久久福利在线| 国产亚洲高清一区| 国产精品1区| 国产日韩一区| 国产精品主播| 久久av网站| 老司机免费视频一区二区三区| 日本亚洲视频在线| 日韩激情一二三区| 日本99精品| 国产乱码精品一区二区三区四区| 欧美日韩va| 精品一区视频| 日本不良网站在线观看|