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

HarmonyOS APP實(shí)戰(zhàn)指南:畫圖APP之畫筆屬性調(diào)節(jié)

 更新時(shí)間:2026年07月13日 10:08:51   作者:不羈的木木  
本篇教你用顏色選擇器、粗細(xì)滑塊和透明度滑塊,實(shí)時(shí)調(diào)節(jié)畫筆效果,告別單調(diào)黑線,從預(yù)設(shè)色板輕松選色,滑動(dòng)控制筆觸粗細(xì)與透明度,跟著步驟集成PenSettings屬性管理器,讓每筆繪畫都自定義,實(shí)現(xiàn)靈活涂鴉體驗(yàn)

1. 開篇

上一篇我們實(shí)現(xiàn)了觸摸手繪功能,核心產(chǎn)出了 PenManager 模塊和 PaintComponent 頁(yè)面。PenManager 通過 touchEvent 回調(diào)收集觸摸點(diǎn),構(gòu)建 Path 對(duì)象,再利用 CanvasRenderingContext2D.drawPath() 將其繪制到畫布上。讀者跟隨步驟,已經(jīng)可以讓手指在屏幕上自由涂鴉了。

然而手繪功能還有一個(gè)關(guān)鍵短板:繪制出的線條顏色固定為黑色、粗細(xì)固定為3px、透明度固定為100%。這樣的筆觸過于單調(diào),無法滿足實(shí)際繪畫需求。本篇將聚焦于畫筆屬性調(diào)節(jié),通過顏色選擇器、粗細(xì)滑塊和透明度滑塊三個(gè)UI組件,讓用戶能夠?qū)崟r(shí)調(diào)整畫筆效果。我們將把這些屬性綁定到 Pen 對(duì)象上,確保每次繪制都使用最新的參數(shù)。

2. 核心實(shí)現(xiàn)

實(shí)現(xiàn)畫筆屬性調(diào)節(jié)需要三個(gè)步驟:首先,創(chuàng)建一個(gè)畫筆屬性配置管理器 PenSettings,用于存儲(chǔ)和更新顏色、粗細(xì)、透明度;其次,設(shè)計(jì)顏色選擇器 ColorPicker 組件,讓用戶可以從預(yù)設(shè)色板中選色;最后,實(shí)現(xiàn)粗細(xì)和透明度的滑塊組件 Slider。所有修改都會(huì)立即反應(yīng)在下一筆繪制中。

2.1 基礎(chǔ)配置:導(dǎo)入模塊與狀態(tài)管理

在畫圖APP中,我們需要導(dǎo)入 @ohos.graphics.drawing 模塊中的 Pen 類,以及狀態(tài)管理接口用于跨組件通信。

// utils/PenSettings.ets
// 畫筆屬性管理器,采用單例模式,全局共享同一份配置
import { Pen } from '@ohos.graphics.drawing';
class PenSettings {
  private static instance: PenSettings = new PenSettings();
  // 當(dāng)前選中的顏色,十六進(jìn)制格式,默認(rèn)黑色
  public currentColor: string = '#FF000000';
  // 當(dāng)前畫筆粗細(xì),單位px,默認(rèn)3
  public currentWidth: number = 3;
  // 當(dāng)前透明度,范圍0-255,默認(rèn)255(完全不透明)
  public currentAlpha: number = 255;
  private constructor() { }
  static getInstance(): PenSettings {
    return PenSettings.instance;
  }
  // 應(yīng)用當(dāng)前設(shè)置到傳入的Pen對(duì)象
  applyToPen(pen: Pen): void {
    // 解析顏色字符串為整數(shù),例如'#FF0000' -> 0xFF0000
    const colorInt = parseInt(this.currentColor.substring(1), 16);
    // 透明度與顏色合并,完成ARGB組合
    const argbColor = (this.currentAlpha << 24) | (colorInt & 0x00FFFFFF);
    pen.setColor(argbColor);
    pen.setStrokeWidth(this.currentWidth);
    pen.setAlpha(this.currentAlpha);
  }
  // 更新顏色,并觸發(fā)畫布重繪(通過回調(diào))
  setColor(color: string): void {
    this.currentColor = color;
    this.onSettingsChanged?.();
  }
  setWidth(width: number): void {
    this.currentWidth = width;
    this.onSettingsChanged?.();
  }
  setAlpha(alpha: number): void {
    this.currentAlpha = alpha;
    this.onSettingsChanged?.();
  }
  // 設(shè)置變更回調(diào),用于通知畫布重新繪制
  onSettingsChanged: (() => void) | null = null;
}
export default PenSettings;

關(guān)鍵點(diǎn)說明

  • 使用單例模式確保整個(gè)APP共享同一份畫筆配置,避免重復(fù)創(chuàng)建。
  • applyToPen 方法接收一個(gè) Pen 實(shí)例,將當(dāng)前顏色、粗細(xì)、透明度一次性應(yīng)用到該筆上。顏色處理時(shí)需要注意透明度要與顏色值合并為ARGB格式。
  • setColor 等方法通過回調(diào)機(jī)制通知外部(如畫布組件)重新繪制,這樣才能在調(diào)整滑塊后立即看到預(yù)覽效果。
  • API參考自 @ohos.graphics.drawing.Pen,其中 setColor / setStrokeWidth / setAlpha 是官方提供的標(biāo)準(zhǔn)方法。

2.2 色彩選擇組件 ColorPicker

ColorPicker 組件提供一個(gè)預(yù)設(shè)顏色網(wǎng)格,用戶點(diǎn)擊某個(gè)色塊后,更新 PenSettings 中的顏色值。

// components/ColorPicker.ets
// 顏色選擇器組件,展示預(yù)設(shè)色板供用戶點(diǎn)擊選擇
import PenSettings from '../utils/PenSettings';
@Component
export struct ColorPicker {
  @State private selectedColor: string = '#FF000000';
  // 預(yù)設(shè)顏色數(shù)組,涵蓋常見繪畫色彩
  private colors: string[] = [
    '#FF000000', '#FFFFFFFF', '#FFFF0000', '#FF00FF00',
    '#FF0000FF', '#FFFFFF00', '#FFFF00FF', '#FF00FFFF',
    '#FF808080', '#FFC0C0C0', '#FF800000', '#FF008000',
    '#FF000080', '#FF808000', '#FF800080', '#FF008080',
    '#FFE0B0FF', '#FFFFC0CB', '#FFA52A2A', '#FF000000'
  ];
  build() {
    Column() {
      // 標(biāo)題
      Text('顏色選擇')
        .fontSize(14)
        .fontWeight(FontWeight.Bold)
        .width('100%')
        .textAlign(TextAlign.Start)
        .margin({ bottom: 6 });
      // 顏色網(wǎng)格,每行5個(gè)
      Grid() {
        ForEach(this.colors, (color: string) => {
          GridItem() {
            Stack() {
              // 色塊方塊
              Rect()
                .width(36)
                .height(36)
                .borderRadius(6)
                .fill(color)
                .border({
                  width: this.selectedColor === color ? 3 : 1,
                  color: this.selectedColor === color ? '#FF007AFF' : '#FFCCCCCC'
                })
                .onClick(() => {
                  this.selectedColor = color;
                  PenSettings.getInstance().setColor(color);
                });
              // 如果是當(dāng)前選中顏色,顯示選中標(biāo)記
              if (this.selectedColor === color) {
                Text('?')
                  .fontSize(18)
                  .fontColor('#FF007AFF')
                  .fontWeight(FontWeight.Bold);
              }
            }
            .justifyContent(FlexAlign.Center)
            .alignItems(VerticalAlign.Center)
            .width(40)
            .height(40)
          }
        })
      }
      .columnsTemplate('1fr 1fr 1fr 1fr 1fr')
      .rowsTemplate('1fr 1fr 1fr 1fr')
      .width('100%')
      .maxHeight(200)
      .columnsGap(8)
      .rowsGap(8)
    }
    .padding(12)
    .backgroundColor('#FFF8F8F8')
    .borderRadius(12)
  }
}

關(guān)鍵點(diǎn)說明

  • 顏色值采用 '#AARRGGBB' 格式,其中 AA 部分在預(yù)設(shè)顏色中固定為 FF(不透明),實(shí)際透明度由 PenSettings 中的 currentAlpha 控制。
  • 選中顏色的色塊會(huì)有藍(lán)色邊框和勾選標(biāo)記,提供清晰的視覺反饋。
  • 點(diǎn)擊色塊時(shí)調(diào)用 PenSettings.getInstance().setColor(color),該操作會(huì)觸發(fā)回調(diào),通知畫布應(yīng)用新顏色。
  • 色板只是預(yù)設(shè)顏色,后續(xù)我們可以擴(kuò)展為自定義色盤,例如使用色相環(huán)選擇。

2.3 粗細(xì)與透明度調(diào)節(jié)滑塊 Slider

使用原生 Slider 組件,分別控制畫筆粗細(xì)(1-20px)和透明度(0-255)。

// components/BrushSlider.ets
// 畫筆粗細(xì)和透明度滑塊組件,支持滑動(dòng)調(diào)節(jié)
import PenSettings from '../utils/PenSettings';
@Component
export struct BrushSlider {
  // 當(dāng)前畫筆粗細(xì)
  @State private brushWidth: number = 3;
  // 當(dāng)前透明度
  @State private brushAlpha: number = 255;
  build() {
    Column({ space: 16 }) {
      // 粗細(xì)調(diào)節(jié)
      Column() {
        Row() {
          Text('粗細(xì)')
            .fontSize(14)
            .fontWeight(FontWeight.Medium);
          Text(`${this.brushWidth}px`)
            .fontSize(12)
            .fontColor('#FF666666')
            .margin({ left: 8 });
        }
        .width('100%')
        .justifyContent(FlexAlign.Start);
        Slider({
          value: this.brushWidth,
          min: 1,
          max: 20,
          step: 1,
          style: SliderStyle.OutSet
        })
          .width('100%')
          .showTips(true)
          .showSteps(false)
          .onChange((value: number) => {
            this.brushWidth = value;
            PenSettings.getInstance().setWidth(value);
          });
      }
      // 透明度調(diào)節(jié)
      Column() {
        Row() {
          Text('透明度')
            .fontSize(14)
            .fontWeight(FontWeight.Medium);
          Text(`${Math.round(this.brushAlpha / 255 * 100)}%`)
            .fontSize(12)
            .fontColor('#FF666666')
            .margin({ left: 8 });
        }
        .width('100%')
        .justifyContent(FlexAlign.Start);
        Slider({
          value: this.brushAlpha,
          min: 0,
          max: 255,
          step: 1,
          style: SliderStyle.OutSet
        })
          .width('100%')
          .showTips(true)
          .showSteps(false)
          .onChange((value: number) => {
            this.brushAlpha = value;
            PenSettings.getInstance().setAlpha(value);
          });
      }
    }
    .padding(12)
    .backgroundColor('#FFF8F8F8')
    .borderRadius(12)
  }
}

關(guān)鍵點(diǎn)說明

  • 粗細(xì)范圍設(shè)置為1-20px,步長(zhǎng)1px,可以滿足從細(xì)線到粗筆的繪畫需求。
  • 透明度范圍0-255,對(duì)應(yīng)0%-100%不透明,右側(cè)顯示百分比以便用戶理解。
  • SlidershowTips 屬性設(shè)為 true,滑動(dòng)時(shí)會(huì)顯示當(dāng)前數(shù)值的工具提示。
  • 每次滑動(dòng)都調(diào)用 PenSettings 的 setWidth / setAlpha 方法,同時(shí)傳遞給其綁定的回調(diào)。

2.4 將設(shè)置組件集成到主畫布頁(yè)面

最后,將上述組件組合到畫圖APP的主頁(yè)面中,并確保每次繪制時(shí)使用 PenSettings 中的最新配置。

// pages/PaintPage.ets
// 畫圖APP主頁(yè)面,集成顏色選擇器、滑塊和畫布區(qū)域
import PenSettings from '../utils/PenSettings';
import { ColorPicker } from '../components/ColorPicker';
import { BrushSlider } from '../components/BrushSlider';
import drawing from '@ohos.graphics.drawing';
@Entry
@Component
struct PaintPage {
  private canvasContext: CanvasRenderingContext2D;
  private settings: PenSettings = PenSettings.getInstance();
  @State private currentTool: string = 'pen'; // 'pen' | 'rect' | 'circle'
  // 當(dāng)前正在使用的Pen對(duì)象
  private drawingPen: drawing.Pen = new drawing.Pen();
  aboutToAppear(): void {
    // 注冊(cè)設(shè)置變更回調(diào):每次顏色/粗細(xì)/透明度變化時(shí),更新當(dāng)前Pen
    this.settings.onSettingsChanged = () => {
      this.settings.applyToPen(this.drawingPen);
    };
    // 初始化時(shí)應(yīng)用默認(rèn)設(shè)置
    this.settings.applyToPen(this.drawingPen);
  }
  build() {
    Column() {
      // 頂部工具欄
      Row() {
        Button('畫筆')
          .onClick(() => { this.currentTool = 'pen'; })
        Button('矩形')
          .onClick(() => { this.currentTool = 'rect'; })
        Button('圓形')
          .onClick(() => { this.currentTool = 'circle'; })
      }
      .padding(8)
      .width('100%')
      .justifyContent(FlexAlign.SpaceEvenly)
      // 中間畫布區(qū)域
      Canvas(this.canvasContext)
        .width('100%')
        .layoutWeight(1)
        .backgroundColor('#FFFFFFFF')
      // 底部設(shè)置區(qū):顏色選擇 + 粗細(xì)/透明度
      Column({ space: 12 }) {
        ColorPicker()
        BrushSlider()
      }
      .padding(8)
      .width('100%')
      .backgroundColor('#FFF0F0F0')
    }
    .width('100%')
    .height('100%')
  }
}

關(guān)鍵點(diǎn)說明

  • aboutToAppear 中注冊(cè)了 PenSettings 的回調(diào) onSettingsChanged,當(dāng)顏色、粗細(xì)或透明度改變時(shí),自動(dòng)調(diào)用 applyToPen 更新 this.drawingPen。
  • 在實(shí)際繪制場(chǎng)景中(如觸摸移動(dòng)的回調(diào)),需要確保使用的是 this.drawingPen,而不是臨時(shí)創(chuàng)建的 Pen 對(duì)象,這樣才能應(yīng)用最新的設(shè)置。
  • 底部布局同時(shí)包含 ColorPicker 和 BrushSlider,用戶可以在繪畫過程中隨時(shí)調(diào)整參數(shù)。

3. 運(yùn)行驗(yàn)證

完成上述代碼后,運(yùn)行APP,應(yīng)觀察到以下效果:

  1. 底部出現(xiàn)顏色選擇器網(wǎng)格,默認(rèn)選中第一個(gè)黑色色塊。點(diǎn)擊其他顏色(如紅色 #FFFF0000),畫布的下一筆線條會(huì)變?yōu)榧t色。
  2. 粗細(xì)滑塊滑動(dòng)時(shí),數(shù)值顯示從1px到20px,釋放后下一筆線條會(huì)使用新粗細(xì)。
  3. 透明度滑塊從0%到100%,滑動(dòng)時(shí)工具提示顯示百分比,筆畫會(huì)呈現(xiàn)不同程度的半透明效果。
  4. 所有調(diào)節(jié)即時(shí)生效,不需要重啟或重新初始化畫布。

立即調(diào)出畫筆的隱藏功能!本篇教你用顏色選擇器、粗細(xì)滑塊和透明度滑塊,實(shí)時(shí)調(diào)節(jié)畫筆效果,告別單調(diào)黑線,從預(yù)設(shè)色板輕松選色,滑動(dòng)控制筆觸粗細(xì)與透明度,跟著步驟集成PenSettings屬性管理器,讓每筆繪畫都自定義,實(shí)現(xiàn)靈活涂鴉體驗(yàn)

4. 小結(jié)與預(yù)告

本篇產(chǎn)出了三個(gè)核心模塊:PenSettings 畫筆屬性管理器、ColorPicker 顏色選擇器、BrushSlider 粗細(xì)與透明度滑塊。這些組件被集成到主畫布頁(yè)面中,實(shí)現(xiàn)了畫筆參數(shù)的實(shí)時(shí)調(diào)節(jié),讓用戶能畫出不同顏色、粗細(xì)和透明度的線條。這個(gè)功能是畫圖APP用戶體驗(yàn)的關(guān)鍵提升點(diǎn),也是后續(xù)實(shí)現(xiàn)形狀繪制、文字添加等功能的基礎(chǔ)。

下一篇「切換繪制模式與交互反饋」將實(shí)現(xiàn)矩形、圓形和自由畫筆三種繪制模式的切換,優(yōu)化UI反饋,讓用戶清晰知道當(dāng)前處于哪種繪制狀態(tài),為后續(xù)的圖形繪制做鋪墊。

到此這篇關(guān)于HarmonyOS APP實(shí)戰(zhàn)指南:畫圖APP之畫筆屬性調(diào)節(jié)的文章就介紹到這了,更多相關(guān)HarmonyOS 繪圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

金坛市| 旬阳县| 江西省| 井冈山市| 东阿县| 瓮安县| 汉源县| 达日县| 九龙城区| 南投市| 龙川县| 巫山县| 永善县| 盱眙县| 三河市| 资兴市| 炎陵县| 江西省| 青州市| 财经| 阳新县| 柳林县| 咸丰县| 旺苍县| 固镇县| 砀山县| 丹东市| 许昌市| 乌兰察布市| 宜昌市| 中江县| 隆安县| 贵德县| 正安县| 辰溪县| 临湘市| 敦化市| 河曲县| 黄平县| 四子王旗| 景东|