<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      時間軸、流程類時間軸繪制

      效果圖

      時間軸效果圖
      • 可控制是否繪制在中間
      • 控制繪制的線條是否為虛線
      • 控制第一條數據圓頂部線條和最后一條數據圓底部線條是否繪制

      除了gif圖片展示的屬性,還可以控制圓的大小顏色、圓是否有上和左偏移、線條顏色等屬性

      除了通用的時間軸繪制,我們還可以通過改變繪制圓的樣式,改為繪制相應的bitmap圖像,來實現展示相關的流程

      流程類時間軸效果圖

      思路

      關于ItemDecoration相關的內容已經寫了不少,這個其實就是小菜一碟。我們需要做的工作有兩點

      • ItemDecoration在getItemOffsets()方法內做相應的偏移
      • onDraw()方法內分別繪制圓、圓頂部線條、圓底部線條
        • 繪制線條,我們需要知道start和end的點坐標;
        • 繪制圓,我們需要知道圓心和半徑;

      通過下圖,你將能清楚地獲取到這些繪制需要的一些信息

      image

      具體實現

      有了以上內容,我們開始繪制

      步驟一:ItemView頂部偏移

       override fun getItemOffsets(
              outRect: Rect,
              view: View,
              parent: RecyclerView,
              state: RecyclerView.State,
          ) {
              if (parent.getChildAdapterPosition(view) != 0) {
                  //第一個不做頂部偏移
                  outRect.top = topItemSpace
              }
              outRect.left = leftItemSpace
      
          }
      

      步驟二:繪制圓和線條

      override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
              //獲取到的是當前屏幕可見的個數
              val childCount = parent.childCount
      
              for (i in 0 until childCount) {
                  val view = parent.getChildAt(i)
                  //獲取真實的在整體數據中的位置
                  val index=parent.getChildAdapterPosition(view)
      
                  //ItemView左側+偏移的矩形框(綠色框部分)
                  val spaceRectTop = if (index == 0) view.top else view.top - topItemSpace
                  val spaceRectBottom = view.bottom
                  val spaceRectLeft = view.left - leftItemSpace
                  val spaceRectRight = view.left
      
                  //ItemView左側,不包含偏移的矩形框(紅色框部分)
                  val dataRectLeft = view.left - leftItemSpace
                  val dataRectTop = view.top
                  val dataRectRight = view.left
                  val dataRectBottom = view.bottom
      
                  //圓心坐標
                  var centerX = if(isDrawAtMiddle) (dataRectLeft + dataRectRight)/ 2  else (dataRectLeft + dataRectRight)/ 2 + circleLeftPadding
                  val centerY =
                      if (isDrawAtMiddle) (dataRectTop + dataRectBottom) / 2 else dataRectTop + circleRadius + circleTopPadding
      
                  //繪制第一條線
                  if (index==0){
                      if (isDrawFirstItemTopLine){
                          c.drawLine(
                              centerX.toFloat(),
                              spaceRectTop.toFloat(),
                              centerX.toFloat(),
                              (centerY - circleRadius).toFloat(),
                              mLinePaint
                          )
                      }
                  }else{
                      c.drawLine(
                          centerX.toFloat(),
                          spaceRectTop.toFloat(),
                          centerX.toFloat(),
                          (centerY - circleRadius).toFloat(),
                          mLinePaint
                      )
                  }
                  //繪制圓(居中顯示)
                  c.drawCircle(centerX.toFloat(), centerY.toFloat(), circleRadius.toFloat(), mCirclePaint)
      
      
                  //繪制第二條線,注意這里要用itemCount,因為上面的childCount是當前頁面可見的個數
                  parent.adapter?.let {
                      if (index!=it.itemCount-1){
                          c.drawLine(
                              centerX.toFloat(),
                              (centerY + circleRadius).toFloat(),
                              centerX.toFloat(),
                              spaceRectBottom.toFloat(),
                              mLinePaint
                          )
                      }else{
                          if (isDrawLastItemBottomLine){
                              c.drawLine(
                                  centerX.toFloat(),
                                  (centerY + circleRadius).toFloat(),
                                  centerX.toFloat(),
                                  spaceRectBottom.toFloat(),
                                  mLinePaint
                              )
                          }
                      }
                  }
              }
          }
      

      注意:下標的獲取

      因為我們需要每個ItemView都繪制,所以需要使用循環。但因為val childCount = parent.childCount獲取到的是當前頁面可見的個數,并不是實際的個數,所以我們在判斷是否是首條或者最后一條數據時,那個index要通過val index=parent.getChildAdapterPosition(view)的方式來獲取到真實的下標位置。

      流程類的繪制

      和繪制通用的圓類似,不過是將Canvas.drawCircle()改為Canvas.drawBitmap()。至于不同的bitmap的加載,我們可以通過傳入集合的數據類型來判斷繪制哪種圖片即可。

      override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
      	...
      	val srcRect = Rect(0, 0, progressBitmap.width, progressBitmap.height)
      	val dstRect = Rect(
              centerX - circleRadius,
              centerY - circleRadius,
              centerX + circleRadius,
              centerY + circleRadius
          )
          c.drawBitmap(errorBitmap, srcRect, dstRect, mCirclePaint)
          ...
      }
      

      總結

      其實主要還是ItemDecoration相關的內容,在onDraw()方法內繪制圓、繪制bitmap和繪制線條,根據上面的圖,知道具體的坐標位置,繪制就很輕松了,也可以在此基礎上繼續擴展,使得我們的時間軸ItemDecoration更加的通用,方便運用到項目中。

      如果本文對你有幫助,請別忘記三連,如果有不恰當的地方也請提出來,下篇文章見。

      時間軸效果圖
      posted @ 2024-06-12 16:39  lidongRebirth  閱讀(393)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲精品人成网线在线| 国产在线国偷精品产拍| 亚洲综合一区国产精品| 久久精品亚洲中文无东京热| 少妇真人直播免费视频| 无遮挡高潮国产免费观看| 伊人久久大香线蕉AV网禁呦| 色护士极品影院| 岛国最新亚洲伦理成人| 精品亚洲精品日韩精品| 亚洲男人天堂2018| 视频一区二区不中文字幕| 亚洲aⅴ无码专区在线观看q| 亚洲精品国产综合久久一线| 国产精品成人久久电影| 亚洲天堂亚洲天堂亚洲色图| 55大东北熟女啪啪嗷嗷叫| 国产69精品久久久久人妻刘玥| 亚洲午夜久久久久久噜噜噜| 伊人激情av一区二区三区| 久久精品一本到99热免费| 色猫咪av在线网址| 国产精品久久久久久久专区| 亚洲中文字幕无码爆乳APP| 定远县| 乱人伦人妻中文字幕无码久久网| 国产精品色内内在线播放| 精品综合久久久久久97| 色成人亚洲| 亚洲乱码一区二区三区视色| 欧美性69式xxxx护士| 国产高清在线男人的天堂| 无码综合天天久久综合网 | 久人人爽人人爽人人片av| 丰满爆乳一区二区三区| 亚洲2017天堂色无码| 狠狠色狠狠色五月激情| 亚洲最大日韩精品一区| 思茅市| 国产一区二区三区精品综合| 亚洲另类无码一区二区三区 |