亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android畫板開發之添加文本文字

2019-10-21 21:32:28
字體:
來源:轉載
供稿:網友

一、前言

添加文本,也是屬于 一個比較簡單的功能,在第二篇的時候,添加了橡皮擦,在橡皮擦里面通過一個模式的形式進行畫筆的判斷,當然文本也是如此,添加一個文本模式,在onTouchDown的時候,彈出PopupWindow,輸入文本,然后PopupWindow消失的時候,利用staticLayout繪制到畫布上即可。當然也有些需要注意的地方

Android,畫板,添加文字

下面一步步來實現

二、實現

2.1 添加文本模式

例如橡皮擦那樣,添加多一個文本模式,然后setModel的時候,需要把畫筆的樣式修改為FILL,如果是STROKE進行文字繪制會變成空心文字。

 

companion object {    const val EDIT_MODE_PEN = 0x1L    //畫筆模式    const val EDIT_MODE_ERASER = 0x2L  //橡皮擦模式    const val EDIT_MODE_TEXT = 0x3L  //文字模式  }  @Retention(AnnotationRetention.SOURCE)  @IntDef(EDIT_MODE_PEN, EDIT_MODE_ERASER, EDIT_MODE_TEXT)  annotation class EditMode  /**   * 設置畫筆模式   */  fun setModel(@EditMode model: Long) {    mMode = model    when (model) {      EDIT_MODE_PEN -> {        //畫線        mPaint.xfermode = null        mPaint.style = Paint.Style.STROKE      }      EDIT_MODE_ERASER -> {        mPaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)      }      EDIT_MODE_TEXT -> {        mPaint.style = Paint.Style.FILL      }    }  }

2.2 修改bean類型

StaticLayout 是一個為不可編輯的文本布局的類,這意味著一旦布局完成,文本內容就不可以改變。在單純地使用TextView來展示靜態文本的時候,創建的就是 StaticLayout,在api25,Textview源碼6858行可以看到。

StaticLayout.Builder builder = StaticLayout.Builder.obtain(mHint, 0,     mHint.length(), mTextPaint, hintWidth)     .setAlignment(alignment)     .setTextDirection(mTextDir)     .setLineSpacing(mSpacingAdd, mSpacingMult)     .setIncludePad(mIncludePad)     .setBreakStrategy(mBreakStrategy)     .setHyphenationFrequency(mHyphenationFrequency);

我們畫板的繪制文字也是用到了這個StaticLayout,它有三個構造方法,我們用最少那個即可:

public StaticLayout(CharSequence source, //字符串   TextPaint paint, //畫筆對象   int width,  //layout的寬度,字符串超出寬度時自動換行。   Layout.Alignment align, //layout的對其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三種。   float spacingmult,  //相對行間距,相對字體大小,1.5f表示行間距為1.5倍的字體高度。   float spacingadd,  //在基礎行距上添加多少   boolean includepad)  //文本頂部和底部是否留白

所以,bean類在之前的基礎上,添加了文本、寬度、xy軸的偏移,然后繪制的時候,利用staticLayout進行了繪制。

data class PaintBean(    var mPaint: Paint,  //保存畫筆    var mPath: Path?,     //保存路徑    var mText: String,    //文本    var mWidth: Int,    var mOffX: Float,    var mOffY: Float,    private @TPTextView.EditMode var mMode:Long) {  constructor(mPaint: Paint, mPath: Path) : this(mPaint,mPath,"",0,0f,0f,TPTextView.EDIT_MODE_PEN)  /**   * 撤銷和反撤銷之后 重新繪制   * @param canvas 繪制的畫布   */  fun draw(canvas: Canvas){    when(mMode){      TPTextView.EDIT_MODE_TEXT -> {        if(!TextUtils.isEmpty(mText)){          //調節畫布起始坐標進行繪制          canvas.translate(mOffX,mOffY)          //利用staticLayout生成文字,不然不能換行          val staticLayout = StaticLayout(mText,mPaint as TextPaint,mWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false)          staticLayout.draw(canvas)          //Log.e("@@","長度:"+staticLayout.width)          //canvas.drawText(mText,mTextOffX,mTextOffY,mPaint)          //恢復畫布坐標          canvas.translate(-mOffX,-mOffY)        }      }      else -> {        canvas.drawPath(mPath,mPaint)      }    }  }  fun getMode():Long = mMode}

2.3 彈窗處理

接下來,設置一個彈框PopupWindow進行文本的輸入,彈窗里面的控件就是一個EditText。 在彈窗消失的時候添加到畫筆列表,然后進行重繪。 在這里有三點注意點

  • 軟鍵盤自動彈出
  • 編輯框顯示在軟鍵盤上面
  • 彈框顯示的位置
  • 右邊越界
private var mTextPopup: PopupWindow? = nullprivate var mTextView: EditText? = null  /**   * 顯示popup文本輸入彈窗   */  private fun showTextPopup() {    if (null == mTextPopup) {      mTextView = EditText(context)      mTextView?.hint = "文字"      mTextPopup = PopupWindow(mTextView,          WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT,          true)      mTextPopup?.setOnDismissListener {        if (!TextUtils.isEmpty(mTextView?.text)) {          //添加到列表          mPaintedList.add(              PaintBean(TextPaint(mPaint), null, mTextView?.text.toString(), (width - preX).toInt(),preX,preY - mTextView!!.height / 2, EDIT_MODE_TEXT))          invalidate()        }      }      //讓popup顯示在軟鍵盤上面      mTextPopup?.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE    }    mTextView?.requestFocus()    //自動彈出軟鍵盤,會導致布局變化,重測量、繪制    val imm = context.getSystemService(Service.INPUT_METHOD_SERVICE) as InputMethodManager    imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)    mTextPopup?.showAtLocation(this, Gravity.TOP and Gravity.LEFT, preX.toInt(), preY.toInt()+mTextView!!.height)  }

在觸摸的時候,進行顯示。 移動的時候不用操作,手指起來的時候也不用操作

 

@SuppressLint("ClickableViewAccessibility")  override fun onTouchEvent(event: MotionEvent): Boolean {    when (event.action) {      MotionEvent.ACTION_DOWN -> { //手指按下的時候        //記錄上次觸摸的坐標,注意ACTION_DOWN方法只會執行一次        preX = event.x        preY = event.y        when (mMode) {          EDIT_MODE_TEXT -> {            //彈出popupWidnwo輸入text            showTextPopup()            //文字在隱藏的時候添加到list          }          else -> {            //將起始點移動到當前坐標            mPath.moveTo(event.x, event.y)            mPaintedList.add(PaintBean(Paint(mPaint), Path(mPath)))          }        }      }      MotionEvent.ACTION_MOVE -> { //手指移動的時候        when (mMode) {          EDIT_MODE_TEXT -> {          }          else -> {            //繪制圓滑曲線,即貝塞爾曲線,貝塞爾曲線這個知識自行了解            mPaintedList.get(mPaintedList.size - 1).mPath?.quadTo(preX, preY, event.x, event.y)            preX = event.x            preY = event.y            //重新繪制,會調用onDraw方法            invalidate()          }        }      }      MotionEvent.ACTION_UP -> {}    }    return true  }

因為繪制在bean類里面,所以view的onDraw方法還是以前那樣,不需要變化:

@SuppressLint("DrawAllocation")  override fun onDraw(canvas: Canvas) {    super.onDraw(canvas)    //超出緩存的就固化到緩存bitmap    while (mPaintedList.size > PAINT_RECORED_NUM) {      val paint = mPaintedList.removeAt(0)      paint.draw(mHoldCanvas!!)    }    //繪制固化的內容到緩存Canvas    mBufferCanvas?.drawBitmap(mHoldBitmap, 0f, 0f, null)    //繪制記錄的畫筆    for (paint in mPaintedList) {      paint.draw(mBufferCanvas!!)    }    //畫出緩存bitmap的內容    canvas.drawBitmap(mBufferBitmap, 0f, 0f, null)  }

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久久久久久久久久久av| 欧美多人乱p欧美4p久久| 高清欧美一区二区三区| 亚洲欧美日韩综合| 91九色在线视频| 日韩av免费在线播放| 成人有码视频在线播放| 亚洲精品国产精品久久清纯直播| 4438全国亚洲精品在线观看视频| 97国产在线观看| 日韩性xxxx爱| 欧美日韩激情视频8区| 91精品视频网站| 国产精品爽黄69| 欧美精品第一页在线播放| 日韩中文字幕欧美| 日韩欧美精品免费在线| 欧美性高潮床叫视频| 欧美老少配视频| www.久久色.com| 57pao国产成人免费| 欧美日韩中文在线| 亚洲午夜色婷婷在线| 亚洲影视九九影院在线观看| 97碰碰碰免费色视频| 亚洲人成电影网站| 狠狠爱在线视频一区| 国产亚洲精品久久久| 国产精品视频最多的网站| 欧美电影在线免费观看网站| 日韩av在线最新| 一区二区三区四区视频| 欧美激情xxxx性bbbb| 成人午夜小视频| 日韩av在线高清| 久久久人成影片一区二区三区观看| 国内精品美女av在线播放| 久久91精品国产91久久久| 国产日韩av在线播放| 久久亚洲综合国产精品99麻豆精品福利| 亚洲精品少妇网址| 国产精品美女999| 亚洲精品在线91| 久久久久久久久久婷婷| 插插插亚洲综合网| 57pao成人国产永久免费| 国产成人精品一区二区在线| 一区二区欧美激情| 亚洲老板91色精品久久| 欧美激情欧美狂野欧美精品| 亚洲情综合五月天| 久久视频这里只有精品| 久久久久久久一区二区| 亚洲韩国青草视频| 国产精品久久久久久av福利| 日韩欧美在线一区| 日韩中文字幕网址| 国产一区二区在线播放| 亚洲精品999| 国产在线观看一区二区三区| 国产日韩欧美自拍| 国产亚洲精品久久久优势| 日韩国产精品一区| 欧美成年人视频网站欧美| 日韩精品极品视频| 国产成人精品电影| 亚洲第一黄色网| 国产免费一区二区三区在线观看| 欧美一级片免费在线| 成人免费看黄网站| 91国产精品电影| 青青草99啪国产免费| 国产精品久久视频| 久久精品视频在线| xxxx欧美18另类的高清| 欧美亚洲激情在线| 45www国产精品网站| 久久精品国产69国产精品亚洲| 国产精品激情自拍| 高清一区二区三区日本久| 欧美性xxxx| 国产精品你懂得| 2020欧美日韩在线视频| 欧美猛少妇色xxxxx| 欧美巨猛xxxx猛交黑人97人| xvideos亚洲| 国产精品视频一区二区三区四| 国产97在线亚洲| 97福利一区二区| 中文字幕亚洲自拍| 精品久久香蕉国产线看观看gif| 欧美日韩精品在线观看| 亚洲美女av在线播放| 色综合男人天堂| 欧美日韩国产成人高清视频| 国产91九色视频| 国产精品美女久久久免费| 中文字幕亚洲欧美在线| 91精品视频大全| 国产精品久久久久久久久免费看| 成人亚洲欧美一区二区三区| 在线精品播放av| 久久99精品久久久久久琪琪| 日韩av中文字幕在线免费观看| 高清欧美电影在线| 青青青国产精品一区二区| 欧美日韩久久久久| 国产在线精品播放| 久久久国产精品视频| 91精品综合视频| 日本一区二区不卡| 国产一区二区三区视频| 国产成人精彩在线视频九色| 日韩欧美aaa| 精品国产乱码久久久久久婷婷| 96精品久久久久中文字幕| 日韩av在线看| 在线色欧美三级视频| 亚洲人高潮女人毛茸茸| 97国产精品久久| 亚洲激情国产精品| 欧美日韩在线影院| 日韩中文字幕视频| 一区二区在线视频播放| 日韩在线观看网站| 亚洲香蕉在线观看| 欧美裸体视频网站| 91wwwcom在线观看| 日韩极品精品视频免费观看| 日韩成人中文字幕在线观看| 欧美大奶子在线| 国产成人在线一区| 中文字幕欧美精品在线| 日韩在线精品视频| 午夜精品在线视频| 欧美激情视频在线免费观看 欧美视频免费一| 性色av一区二区三区在线观看| 国产精品丝袜久久久久久高清| 欧美高清自拍一区| 欧美成人午夜视频| 国产精品jvid在线观看蜜臀| 久久精品久久精品亚洲人| 91网站免费看| 久久精品久久久久| 欧美日韩一区二区在线| 亚洲成在人线av| 国产免费一区二区三区香蕉精| 国产视频精品一区二区三区| 免费不卡欧美自拍视频| 亚洲欧美在线一区二区| 亚洲性夜色噜噜噜7777| 欧美一级片免费在线| 欧美夫妻性生活xx| 国产精品狠色婷| 亚洲国产高清福利视频| 精品国产一区二区在线| 91视频88av| 久久久久久久久综合| 国产精品h在线观看| 国产精品第七影院| 国产精品国模在线| 深夜精品寂寞黄网站在线观看| 日韩一区二区在线视频| 亚洲三级黄色在线观看|