最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實(shí)現(xiàn)手寫(xiě)板功能

 更新時(shí)間:2022年06月29日 15:23:20   作者:伏輒  
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)手寫(xiě)板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android實(shí)現(xiàn)手寫(xiě)板功能的具體代碼,供大家參考,具體內(nèi)容如下

自定義個(gè)一個(gè)手寫(xiě)板的重點(diǎn):

筆畫(huà)為一次down-move-up的集合

撤銷(xiāo)筆畫(huà)并非一次path的動(dòng)作撤銷(xiāo) 應(yīng)該也是一次down-move -up的撤銷(xiāo)

為了更好的筆畫(huà)需要使用貝塞爾曲線來(lái)完成

效果如下:

截圖中清楚 的意思是清除 !

具體代碼如下:

package com.kyli.base.view;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;

/**
?* 繪制畫(huà)板
?*/
public class SignBoradView extends View {
? ? /*4個(gè)像素點(diǎn)*/
? ? private int beierThreshold = 4;
? ? private float x = 0;
? ? private float y = 0;
? ? /*畫(huà)筆*/
? ? private Paint mPaint;
? ? /*寬度*/
? ? private int strokeWidth = 10;

? ? /*yanbse*/
? ? private int color = Color.BLACK;

? ? /*當(dāng)前筆畫(huà)*/
? ? private Path path;

? ? private int state = State.CLEAR;

? ? private interface State {
? ? ? ? /*畫(huà)板可以使用了*/
? ? ? ? int START = 0;

? ? ? ? /*停止使用畫(huà)板*/
? ? ? ? int STOP = 1;
? ? ? ? /*清空畫(huà)板*/
? ? ? ? int CLEAR = 2;
? ? }

? ? private List<EveryPenPath> everyPenPaths = new ArrayList<>();

? ? /*每一個(gè)筆畫(huà)*/
? ? private static class EveryPenPath {
? ? ? ? public Path path;
? ? }

? ? public SignBoradView(Context context) {
? ? ? ? super(context);
? ? }

? ? public SignBoradView(Context context, @Nullable AttributeSet attrs) {
? ? ? ? super(context, attrs);
? ? }

? ? public SignBoradView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
? ? ? ? super(context, attrs, defStyleAttr);
? ? }

? ? private void initPaint() {
? ? ? ? if (mPaint == null) {
? ? ? ? ? ? mPaint = new Paint();
? ? ? ? ? ? mPaint.setStrokeWidth(strokeWidth);
? ? ? ? ? ? mPaint.setColor(color);
? ? ? ? ? ? mPaint.setStyle(Paint.Style.STROKE);
? ? ? ? ? ? mPaint.setAntiAlias(true);
? ? ? ? ? ? mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
? ? ? ? }
? ? }

? ? public void start() {
? ? ? ? state = State.START;
? ? ? ? initPaint();

? ? }

? ? /*停止使用*/
? ? public void stop() {
? ? ? ? state = State.STOP;
? ? }

? ? /*清空畫(huà)板*/
? ? public void clear() {
? ? ? ? state = State.CLEAR;
? ? ? ? for (int i = everyPenPaths.size() - 1; i >= 0; i--) {
? ? ? ? ? ? EveryPenPath everyPenPath = everyPenPaths.get(i);
? ? ? ? ? ? everyPenPath.path.reset();
? ? ? ? ? ? everyPenPath.path.close();
? ? ? ? ? ? everyPenPath.path = null;

? ? ? ? }
? ? ? ? everyPenPaths.clear();
? ? ? ? invalidate();

? ? }


? ? public void back() {
? ? ? ? int count = everyPenPaths.size();
? ? ? ? if (count < 1)
? ? ? ? ? ? return;
? ? ? ? EveryPenPath everyPenPath = everyPenPaths.get(count - 1);
? ? ? ? everyPenPath.path.reset();
? ? ? ? everyPenPath.path.close();
? ? ? ? everyPenPath.path = null;
? ? ? ? everyPenPaths.remove(count - 1);
? ? ? ? invalidate();
? ? }


? ? @Override
? ? protected void onDraw(Canvas canvas) {
? ? ? ? super.onDraw(canvas);
? ? ? ? if (state == State.START) {

? ? ? ? ? ? /*先繪制完整筆畫(huà)*/
? ? ? ? ? ? for (EveryPenPath e : everyPenPaths) {
? ? ? ? ? ? ? ? canvas.drawPath(e.path, mPaint);
? ? ? ? ? ? }
? ? ? ? ? ? //當(dāng)前進(jìn)行中的 ?path!=null
? ? ? ? ? ? if (path != null) {
? ? ? ? ? ? ? ? canvas.drawPath(path, mPaint);
? ? ? ? ? ? }

? ? ? ? }

? ? }


? ? @Override
? ? public boolean onTouchEvent(MotionEvent event) {
? ? ? ? if (state == State.START) {
? ? ? ? ? ? if (event.getAction() == MotionEvent.ACTION_UP) {
? ? ? ? ? ? ? ? actionUp(event);
? ? ? ? ? ? ? ? invalidate();
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? ? ? if (event.getAction() == MotionEvent.ACTION_MOVE) {
? ? ? ? ? ? ? ? actionMove(event);
? ? ? ? ? ? ? ? invalidate();
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? ? ? if (event.getAction() == MotionEvent.ACTION_DOWN) {
? ? ? ? ? ? ? ? actionDown(event);
? ? ? ? ? ? ? ? invalidate();
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return super.onTouchEvent(event);
? ? }


? ? private void actionUp(MotionEvent event) {
? ? ? ? actionMove(event);
? ? ? ? /*構(gòu)成一個(gè)筆畫(huà)*/
? ? ? ? EveryPenPath everyPenPath = new EveryPenPath();
? ? ? ? everyPenPath.path = path;
? ? ? ? everyPenPaths.add(everyPenPath);
? ? ? ? //將當(dāng)前畫(huà)筆置位null;
? ? ? ? path = null;

? ? }

? ? /**/
? ? private void actionMove(MotionEvent event) {
? ? ? ? /*每次移動(dòng)去繪制貝塞爾曲線*/
? ? ? ? float cX = event.getX();
? ? ? ? float cY = event.getY();
? ? ? ? float dX = Math.abs(cX - x);//變化量
? ? ? ? float dY = Math.abs(cY - y);

? ? ? ? if (dX >= beierThreshold || dY >= beierThreshold) {
? ? ? ? ? ? float rX = x + (cX - x) / 2;
? ? ? ? ? ? float rY = y + (cY - y) / 2;
? ? ? ? ? ? path.quadTo(rX, rY, cX, cY);
? ? ? ? ? ? //下次的x 域y 將重新計(jì)算
? ? ? ? ? ? x = cX;
? ? ? ? ? ? y = cY;
? ? ? ? }
? ? }

? ? /*開(kāi)始時(shí)*/
? ? private void actionDown(MotionEvent event) {
? ? ? ? path = new Path();
? ? ? ? x = event.getX();
? ? ? ? y = event.getY();
? ? ? ? path.moveTo(x, y);
? ? }


? ? public void setBeierThreshold(int beierThreshold) {
? ? ? ? this.beierThreshold = beierThreshold;
? ? }


? ? public void setStrokeWidth(int strokeWidth) {
? ? ? ? this.strokeWidth = strokeWidth;
? ? }


? ? public void setColor(int color) {
? ? ? ? this.color = color;
? ? }

? ? public Bitmap getResult(int bgColor) {
? ? ? ? if (everyPenPaths.size() == 0)
? ? ? ? ? ? return null;
? ? ? ? Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
? ? ? ? Canvas canvas = new Canvas(bitmap);
? ? ? ? canvas.drawColor(bgColor);
? ? ? ? for (int i = 0; i < everyPenPaths.size(); i++) {
? ? ? ? ? ? if (mPaint == null) {
? ? ? ? ? ? ? ? initPaint();

? ? ? ? ? ? }
? ? ? ? ? ? canvas.drawPath(everyPenPaths.get(i).path, mPaint);
? ? ? ? }
? ? ? ? return bitmap;
? ? }

? ? public Bitmap getResult() {
? ? ? ? return getResult(Color.WHITE);
? ? }
}

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

相關(guān)文章

  • Android.bp語(yǔ)法和使用方法講解

    Android.bp語(yǔ)法和使用方法講解

    Android.bp是用來(lái)替換Android.mk的配置文件,下面這篇文章主要給大家介紹了關(guān)于Android.bp語(yǔ)法和使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Android自定義Gallery控件實(shí)現(xiàn)3D圖片瀏覽器

    Android自定義Gallery控件實(shí)現(xiàn)3D圖片瀏覽器

    這篇文章主要介紹了Android自定義Gallery控件實(shí)現(xiàn)3D圖片瀏覽器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Android滾動(dòng)條廣告實(shí)現(xiàn)代碼示例

    Android滾動(dòng)條廣告實(shí)現(xiàn)代碼示例

    本篇文章主要介紹了Android滾動(dòng)條廣告實(shí)現(xiàn)代碼示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Android時(shí)分秒計(jì)時(shí)器的兩種實(shí)現(xiàn)方法

    Android時(shí)分秒計(jì)時(shí)器的兩種實(shí)現(xiàn)方法

    這篇文章主要介紹了Android時(shí)分秒計(jì)時(shí)器的兩種實(shí)現(xiàn)方法,分別是Chronometer控件和handler+timer+timerTask方式,非常不錯(cuò),感興趣的朋友一起看下吧
    2016-08-08
  • Android實(shí)現(xiàn)指針刻度轉(zhuǎn)盤(pán)

    Android實(shí)現(xiàn)指針刻度轉(zhuǎn)盤(pán)

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)指針刻度轉(zhuǎn)盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 優(yōu)化Gradle提升Gradle編譯速度

    優(yōu)化Gradle提升Gradle編譯速度

    今天小編就為大家分享一篇關(guān)于優(yōu)化Gradle提升Gradle編譯速度的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Android UI實(shí)現(xiàn)單行文本水平觸摸滑動(dòng)效果

    Android UI實(shí)現(xiàn)單行文本水平觸摸滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Android UI實(shí)現(xiàn)單行文本水平觸摸滑動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Android自定義View實(shí)現(xiàn)進(jìn)度條動(dòng)畫(huà)

    Android自定義View實(shí)現(xiàn)進(jìn)度條動(dòng)畫(huà)

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)進(jìn)度條動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 淺談Android客戶端與服務(wù)器的數(shù)據(jù)交互總結(jié)

    淺談Android客戶端與服務(wù)器的數(shù)據(jù)交互總結(jié)

    這篇文章主要介紹了淺談Android客戶端與服務(wù)器的數(shù)據(jù)交互總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Android?Flutter實(shí)現(xiàn)自由落體彈跳動(dòng)畫(huà)效果

    Android?Flutter實(shí)現(xiàn)自由落體彈跳動(dòng)畫(huà)效果

    粒子運(yùn)動(dòng)是將對(duì)象按照一定物理公式進(jìn)行的自定義軌跡運(yùn)動(dòng),與普通動(dòng)畫(huà)不同的是,它沒(méi)有強(qiáng)制性的動(dòng)畫(huà)開(kāi)始到結(jié)束的時(shí)間概念。本文將利用Flutter實(shí)現(xiàn)自由落體彈跳動(dòng)畫(huà)效果,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-10-10

最新評(píng)論

淳安县| 临城县| 清镇市| 三江| 明光市| 梁河县| 安顺市| 苍溪县| 紫金县| 右玉县| 同德县| 永年县| 宜良县| 湘潭县| 北安市| 汉阴县| 皮山县| 嘉义县| 民权县| 苏尼特右旗| 武强县| 宝鸡市| 三明市| 麻栗坡县| 桃源县| 南投县| 沂水县| 同仁县| 龙南县| 宜川县| 曲沃县| 潜江市| 平潭县| 合山市| 凤山市| 仪征市| 扶绥县| 大埔区| 崇左市| 江川县| 北京市|