J2ME中实现半透明

本文介绍在J2ME环境下,如何针对不同机型实现半透明图片效果。提供了两种方法:一是利用诺基亚API,适合诺基亚及兼容设备;二是使用MIDP2.0 API,更通用。文中详细展示了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在J2ME MIDP1.0规范中并未实现半透明 功能,只有少数手机厂商提供这方面的API,例如诺基亚.到了MIDP2.0,虽然已经提供了像getRGB(),drawRGB()这样的API,但仍然有很部分MIDP2.0的手机不能实现半透明(目前所知的摩托E398就无法实现半透明),鉴于这种情况,使得在游戏开发中,不可能用同一种方法实现各种不同品牌不同机型上的半透明效果),因而,必须对具体机型做针对性的处理.以下是两种创建半透明图片的方法:

1.利用诺基亚自身提供的API,适合诺基亚手机和支持诺基亚开发包的手机(如索爱K700)

/**
   * 
@param path 源图片的路径
   * 
@param w 源图片宽
   * 
@param h 源图片高
   * 
@return 半透明图
   
*/

  Image createAlphaImage(String path,
int w,int h) {
   DataInputStream dis 
= new DataInputStream(getClass().getResourceAsStream(path));
   ByteArrayOutputStream baos 
= new ByteArrayOutputStream();
  
try {
    
try {
      
while (true{
        baos.write(dis.readByte());
      }

    }

    
catch (IOException ex1) {
    }

    dis.close();
  }

  
catch (IOException ex) {
  }

   
//将源PNG图片数据转成字节数组
   byte[] data=baos.toByteArray();
   
short[] pixels=new short[w*h];
   
   
//创建可变图片
   Image img=DirectUtils.createImage(data,0,data.length);
   Graphics g
=img.getGraphics();
   DirectGraphics dg
=DirectUtils.getDirectGraphics(g);
   
//此处DirectGraphics.TYPE_USHORT_4444_ARGB只针对QD等1.0的手机 对于2.0手机根据具体颜色制式做调整
   dg.getPixels(pixels,0,w,0,0,w,h,DirectGraphics.TYPE_USHORT_4444_ARGB);
   
int length=pixels.length;
   
for(int i=0;i<length;i++){
       
//设置alpha值 即半透明度
     pixels[i]=(short)((pixels[i]&0x0fff)+0x3000);
   }

   dg.drawPixels(pixels,
true,0,w,0,0,w,h,0,dg.TYPE_USHORT_4444_ARGB);
   
return img;
  }

对于上面getPixels()方法,由于QD系列手机中分别采用4个bit来表示RGB三种颜色,另加4bit作为alpha通道,因此,它的颜色制式实现上只占用4*4=16bit,即一个short,所以用DirectGraphics.TYPE_USHORT_4444_ARGB制式.对于其他机型,可参考诺基亚J2ME开发文档.

以上方法适用于通过已有图片创建半透明图片.而对于想创建半透明的纯色图片,则更简单.

 

/**
  * 创建半透明图片
  * 
@param argb 半透明度 取值在0到100之间
  * 
@param width 图片宽度
  * 
@param height 图片高度
  * 
@return 创建好的半透明图片
  
*/

  
public static Image createAlpImageQD(int argb,int w,int h){
  
int length=w*h;
  
short[] pixels=new short[length];
  
try{
      
//创建一张黑色的可变图片
  Image img=DirectUtils.createImage(w,h,0x0000);
  Graphics g
=img.getGraphics();
  DirectGraphics dg
=DirectUtils.getDirectGraphics(g);
  
int alpha=(argb*0xf/100)&0xf;
  argb
=alpha<<12;
  
for(int i=0;i<length;i++){
  pixels[i]
=(short)(0x0|argb);
  }

  dg.drawPixels(pixels,
true,0,w,0,0,w,h,0,DirectGraphics.TYPE_USHORT_4444_ARGB);
//  numb2=200;
  return img;
  }
catch(Exception e){}
  
return null;
  }

2,使用MIDP2.0提供的API实现半透明

 

/**
  * 创建半透明图片(MIDP2.0)
  * 
@param path 源PNG图片路径
  * 
@return 创建好的半透明图片
  
*/

  Image createAlphaImage(String path)
{
      
try{
          Image tmpImage 
= Image.createImage(path);
      
int[]data=new int[tmpImage.getWidth()*tmpImage.getHeight()];
      tmpImage.getRGB(data,
0,tmpImage.getWidth(),0,0,tmpImage.getWidth(),tmpImage.getHeight());
      
int len=data.length;
      
for(int i=0;i<len;i++){
          
//0x65000000为半透明度,可根据需要适当调整
        data[i]=data[i]+0x65000000;
      }

      
return Image.createRGBImage(data,tmpImage.getWidth(),tmpImage.getHeight(),true);
      }

      
catch(Exception e){
          System.out.println(
"create Alpha Image fail!!");
          
return null;
      }

  }
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值