HarmonyOS 鸿蒙Next 图片渐变切换问题,请问怎么实现

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 图片渐变切换问题,请问怎么实现

图片渐变切换问题,,请问怎么实现

2 回复

demo如下:


import { promptAction } from '[@kit](/user/kit).ArkUI';

import {getImageColor} from './ImageUtils'

[@Entry](/user/Entry)

[@Component](/user/Component)

struct SwiperPage {

  [@State](/user/State) message: string = 'Hello World';

  [@State](/user/State) baseColors: Array<[

    ResourceColor,

    number

  ]> = [[Color.Blue, 0.0], [0x0000ff, 0.3], [0xff0000, 1.0], ]

  [@State](/user/State) baseColorsCol2: Array<[

    ResourceColor,

    number

  ]> = [[Color.Blue, 0.0], [0x0000ff, 0.3], [0xff0000, 1.0], ]

  swiperController:SwiperController = new SwiperController()

  swiperItems: SwiperItemData[] = [

    new SwiperItemData(ImageUrl, '内容1'),

    new SwiperItemData(ImageUrl, '内容2'),

    new SwiperItemData(ImageUrl, '内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3'),

  ]

  newsItems: NewsItemData[] = [

    new NewsItemData('学习卡|坚持以人民为中心谋划和和推进改革', '央视新闻客户端 08-26'),

    new NewsItemData('习言道|中国共产党始终把统一战线摆在重要位置', '中国新闻网 08-26'),

    new NewsItemData('习言道|中国共产党始终把统一战线摆在重要位置', '中国新闻网 08-26'),

    new NewsItemData('习言道|中国共产党始终', '中国新闻网 08-26'),

    new NewsItemData('习言道|中国共产党始终把统一战线摆在重要位置', '中国新闻网 08-26'),

  ]

  aboutToAppear(): void {

    getImageColor(ImageUrl, 10, 10).then(color => {

      this.baseColors.splice(2,1, [color, 1.0])

    })

    getImageColor(ImageUrl, 10, 100).then(color => {

      this.baseColorsCol2.splice(2,1, [color, 1.0])

    })

  }

  build() {

    Column() {

      Stack() {

        Row(){

          Column().width('50%').height('400').backgroundColor(Color.Red).linearGradient({

            angle: 180,

            colors: this.baseColors

          })

          Column().width('50%').height('400').backgroundColor(Color.Black).linearGradient({

            angle: 180,

            colors: this.baseColorsCol2

          })

        }

        Column() {

            this.NewsBuilder(this.newsItems)

          }.zIndex(2)

        .padding({left:5, right: 5})

      }

      this.SwiperBuilder(this.swiperItems)

    }

  }

  [@Builder](/user/Builder)

  NewsBuilder(items:NewsItemData[]) {

    Column(){

      ForEach(items, (item: NewsItemData) =>  {

        Column() {

          Text(item.title).fontSize(20).margin({bottom: 5})

          Text(item.from).fontSize(12).fontColor('#6a000000')

        }.margin({bottom: 10})

        .alignItems(HorizontalAlign.Start)

        .onClick(() => {

          promptAction.showDialog({message: '功能开发中'})

        })

      })

    }.margin({top: 30})

    .padding({left: 5, right:5, top: 10, bottom: 10})

    .width('100%')

    .alignItems(HorizontalAlign.Start)

    .backgroundColor(Color.White)

    .borderRadius(8)

  }

  [@Builder](/user/Builder)

  SwiperBuilder(items:SwiperItemData[]) {

    Row() {

      Swiper(this.swiperController) {

        ForEach(items,

          (item: SwiperItemData) => {

              Image(item.iconUrl).borderRadius('8vp').width('100%').onClick(() => {

                promptAction.showDialog({ message: '功能开发中' })

              })

                .overlay(this.textBuilder(item.content), {

                  align: Alignment.Bottom,

                  offset: { x: 10, y: -15 },

                })

          }, (item: SwiperItemData) => JSON.stringify(item))

      }

      .onChange((index: number) => {

        // 取色

        getImageColor(items[index].iconUrl, 10, 10).then(color => {

          console.log('#######result', color)

          this.baseColors.splice(2,1, [color, 1.0])

        });

        // 取色

        getImageColor(items[index].iconUrl, 600, 10).then(color => {

          console.log('#######result', color)

          this.baseColorsCol2.splice(2,1, [color, 1.0])

        });

      })

    }

  }

  [@Builder](/user/Builder)

  textBuilder(content: string) {

    Text(content).fontColor(Color.White)

      .fontSize(20)

  }

}

export class NewsItemData{

  title: string;

  from: string

  constructor(title: string, from: string) {

    this.title = title;

    this.from = from;

  }

}

export class SwiperItemData{

  iconUrl: string;

  content: string

  constructor(iconUrl: string, content: string) {

    this.iconUrl = iconUrl;

    this.content = content;

  }

}


// ImageUtils.ets

import http from '[@ohos](/user/ohos).net.http';

import ResponseCode from '[@ohos](/user/ohos).net.http';

import effectKit from '[@ohos](/user/ohos).effectKit';

import image from '[@ohos](/user/ohos).multimedia.image';

export const getImageColor = async (imageUrl: string, x: number, y: number): Promise<string> => {

  return new Promise(async (resolve, reject) => {

    const data: http.HttpResponse = await http.createHttp().request(imageUrl)

    let code: number = data.responseCode;

    if (ResponseCode.ResponseCode.OK === code) {

      let imageSource = image.createImageSource(data.result as string);

      console.time('get color time')

      const pixelMap: image.PixelMap = await imageSource.createPixelMap({desiredRegion: { size: { height: 1, width: 2 }, x, y }});

      effectKit.createColorPicker(pixelMap, (error, colorPicker) => {

        let result = colorPicker.getMainColorSync()

        let color = `#${result.alpha.toString(16)}${result.red.toString(16)}${result.green.toString(16)}${result.blue.toString(16)}`

        resolve(color)

      })

    }

  })

}

更多关于HarmonyOS 鸿蒙Next 图片渐变切换问题,请问怎么实现的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中实现图片渐变切换,通常涉及UI动画与图像处理的结合。以下是一个简要的实现思路:

  1. 准备资源:首先,确保你拥有需要进行渐变切换的两张或多张图片资源。

  2. 布局设计:在XML布局文件中,定义用于显示图片的ImageView或自定义视图组件。

  3. 动画实现

    • 利用AnimationSetAlphaAnimationTranslateAnimation等动画类,实现图片透明度或位置的变化,从而模拟渐变效果。
    • 或者,使用CanvasPaint类在自定义视图中手动绘制图片,并通过调整PaintShader属性(如LinearGradient)来实现渐变效果。
  4. 切换逻辑:在代码中,通过监听器(如按钮点击事件)触发图片切换动画,按顺序播放动画以实现渐变效果。

  5. 性能优化:注意图片资源的大小和分辨率,避免内存泄漏和性能瓶颈。

以上是实现图片渐变切换的基本步骤。由于具体实现可能涉及复杂的动画逻辑和UI设计,建议参考HarmonyOS的官方文档和示例代码进行进一步开发和调试。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部