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

您的位置:首頁技術文章
文章詳情頁

Android自定義控件實現時間軸

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

本文實例為大家分享了Android自定義控件實現時間軸的具體代碼,供大家參考,具體內容如下

由于項目中有需求,就簡單的封裝一個,先記錄一下,有時間上傳到github。

1、先增加自定義屬性:

<?xml version='1.0' encoding='utf-8'?><resources> <declare-styleable name='global_TimelineLayout'><!--時間軸左偏移值--><attr name='global_line_margin_left' format='dimension' /><!--時間軸上偏移值--><attr name='global_line_margin_top' format='dimension' /><!--線寬--><attr name='global_line_stroke_width' format='dimension' /><!--線的顏色--><attr name='global_line_color' format='color' /><!--點的大小--><attr name='global_point_inner_size' format='dimension' /><attr name='global_point_out_size' format='dimension' /><!--點的上偏移值--><attr name='global_point_margin_top' format='dimension' /><!--點的顏色--><attr name='global_point_inner_color' format='color' /><attr name='global_point_out_color' format='color' /><!--圖標--><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、自定義時間軸類:

/** * 時間軸控件 * <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 //內圓半徑 private var mPointInnerSize: Int = 8 //外圓半徑 private var mPointOutSize: Int = 18 //內圓顏色 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 //點的畫筆 private var mPointPaint: Paint? = null //第一個點的位置 private var mFirstX = 0 private var mFirstY = 0 //最后一個圖標的位置 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 //虛線設置 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) //畫圓外環mPointPaint?.color = mPointOutColorcanvas.drawCircle(mFirstX.toFloat(), mFirstY.toFloat(), mPointOutSize.toFloat(), mPointPaint)//畫圓內環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 //從開始的點到最后的圖標之間,畫一條線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>

也可以在代碼里面動態設置相關屬性(相關屬性注釋,在自定義屬性時有說明):

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

僅供大家參考!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷亚洲成人| 婷婷丁香综合| 亚洲精品欧美| 免费欧美在线视频| 亚洲精品人人| 欧美影院精品| 你懂的网址国产 欧美| 久久精品国产精品亚洲毛片| 国产视频一区二| 亚洲综合专区| 欧美亚洲三区| 欧美精品97| 麻豆成人91精品二区三区| 久久精品 人人爱| 国产亚洲精品精品国产亚洲综合 | 精品一区二区三区在线观看视频| 国产精品传媒麻豆hd| 国产精品久久免费视频| 麻豆国产精品777777在线| 久久精品免费看| 日韩在线看片| 欧美午夜不卡| 日韩一区精品字幕| 国产欧美综合一区二区三区| 欧美激情一区| 亚洲国产福利| 91九色精品| 日韩区一区二| 国产在线观看www| 一本色道精品久久一区二区三区| 综合亚洲自拍| 精品丝袜久久| 欧美日韩国产探花| 日本午夜精品久久久| 国产一区不卡| 欧美91福利在线观看| 中文字幕av一区二区三区人| 日本中文字幕一区二区视频| 久久中文欧美| 亚洲黑丝一区二区| 亚洲三级精品| 97视频热人人精品免费| 91超碰国产精品| 日本特黄久久久高潮| 欧美www视频在线观看| 精品一区亚洲| 国产精品中文| 欧美日韩国产高清电影| 欧美综合社区国产| 久久一区二区三区喷水| 日韩精品高清不卡| 久久九九精品| 日韩av中文字幕一区| 国产精品二区不卡| 日韩制服丝袜av| 国产中文欧美日韩在线 | 视频一区二区三区入口| 欧美激情视频一区二区三区免费 | 免费人成精品欧美精品 | 99久精品视频在线观看视频| 18国产精品| 久久国产亚洲精品| 欧美日韩va| 亚洲国产日韩欧美在线| 国产精品一区二区99| 欧美99久久| 国产精品99久久免费| 国产模特精品视频久久久久| 精品久久亚洲| 午夜精品影视国产一区在线麻豆| 成人综合一区| 亚洲欧美日本国产| 国产videos久久| 亚洲欧洲美洲国产香蕉| 久久久水蜜桃av免费网站| 国产探花在线精品一区二区| aa亚洲婷婷| 亚洲精品国产嫩草在线观看| 国产精品蜜月aⅴ在线| 日韩专区欧美专区| 尤物tv在线精品| 国产成人精品一区二区三区免费 | 亚洲欧美不卡| 日韩精品一卡| 国产精品久久久久久久免费软件| 91久久黄色| 欧美日韩国产观看视频| 国产精品hd| 欧美亚洲一级| 亚洲精品影视| 狠狠干综合网| 久久三级视频| 国产高潮在线| 免费一区二区三区在线视频| 日韩国产在线一| 亚洲一区二区三区中文字幕在线观看 | 亚洲精品高潮| 女人天堂亚洲aⅴ在线观看| 福利在线一区| 国产精品va| 欧美亚洲三级| 91精品国产自产观看在线| 免费一区二区视频| 午夜一级久久| 麻豆精品网站| 日韩午夜电影| 激情欧美一区二区三区| 天堂√8在线中文| 日韩成人免费| 色婷婷色综合| 欧美www视频在线观看| 国产一区二区三区四区五区传媒| 久久精品资源| 国产videos久久| 高清在线一区| 97精品97| 日韩成人亚洲| 久久久9色精品国产一区二区三区| 亚洲伦乱视频| 999久久久免费精品国产| 久久国产中文字幕| 欧美日韩国产精品一区二区亚洲| 好吊视频一区二区三区四区| 尤物在线精品| 老色鬼久久亚洲一区二区| 欧美专区18| 亚洲精品日本| 欧美亚洲三级| 国产精品777777在线播放| 青草av.久久免费一区| 日韩高清不卡一区| 国产欧美午夜| 粉嫩av一区二区三区四区五区| 精品国产一区二区三区性色av| 精品视频99| 日韩理论片av| 91精品国产调教在线观看| 亚洲精品在线观看91| 另类激情亚洲| 日韩激情视频网站| 国产日韩高清一区二区三区在线| 国产精品香蕉| 国产精选在线| 亚洲午夜黄色| 亚洲一区二区免费看| 视频一区在线播放| 欧美在线黄色| 久久亚洲精精品中文字幕| 中文在线资源| 在线亚洲免费| 91精品国产自产在线丝袜啪| 久久久久久久久成人| 日韩精品麻豆| 久久国产精品99国产| 欧美天堂在线| 日韩伦理一区| 亚洲开心激情| 精品久久网站| 香蕉精品视频在线观看| 亚洲综合二区| 国产图片一区| 国产v综合v| 亚洲字幕久久| 激情综合婷婷| 91久久亚洲| 国产欧美日韩精品一区二区三区| 色乱码一区二区三区网站| 亚洲精品极品少妇16p| 青草国产精品| 亚洲免费福利| 亚洲制服一区| 91亚洲人成网污www| 免费在线观看精品| 老色鬼精品视频在线观看播放| 久久麻豆精品| 91免费精品国偷自产在线在线| 亚洲精品成人图区| 综合激情婷婷| 精品免费在线| 中文不卡在线| 五月激情久久| 日韩av网站免费在线| 中文一区一区三区高中清不卡免费| 亚洲欧美日韩国产| 国产一区2区| 日韩中文一区二区| 日韩影院二区| 国产色噜噜噜91在线精品| 日韩精品免费一区二区三区| 四虎成人精品一区二区免费网站| 国产一区二区三区四区| 水野朝阳av一区二区三区| 国产一区二区三区探花| 在线观看视频免费一区二区三区| 久久精品国产免费| 亚洲丝袜啪啪| 欧美日韩中文一区二区| 国产欧美日韩精品一区二区三区 | 日韩电影二区| 日韩高清二区|