j2me中使用canvas设置背景颜色示例

依旧是拿例子来学习,再翻一翻讲解,就大致了解一个程序的架构。

在用Canvas写手机界面,其实不过就是自画图而已,在wtk中有个minicolor的例子,
用的是canvas类,其中也讲解了相关的知识点。
这里罗列下几个知识点:

调用repaint()产生重绘事件。

底层事件分为三类:
 Press Events  按键事件
 Action Keys   动作按键
 PointerEvents 触控事件
 
按键事件
keyPressed()   
keyReleased()
keyRepeated()

  在RepeatEvents 不是 JTWI 要求强制支持的,故需调用hasRepeatEvents判定。

   当按下按键都会触发 keyPressed()函数,并传入相应位置的整数值,
   有KEY_NUM0- KEY_NUM9 十个常数分别代表键盘上的 0-9,及其两个功能键,
   KEY_STAR,KEY_POUND, 若传入的值小于 0,则为不合法的 keycode
 
 动作按键主要针对游戏来设计的,
 有如下:
  UP,DOWN,LEFT,RIGHT,
  GAME_A,GAME_B,GAME_C,GAME_D,
  当按下这些按键时会映射到为每个按键事件编写的方法,来完成一些动作。
  在MIDP2.0里已有游戏开发包了可供学习。
 
触控事件主要面向高端设备,并非 JTWI 要求强制支持的,

pointerPressed(),
pointerReleased(),
pointerDragged(),

对应移动设备手写笔的点,击,拖拽几个动作。参考 WTK的说明文档


在运行minicolor demo,老方法,创建该工程文件,及其同名类。(可以自命名)
注意一点的是:
在wtk中,无法直接调用canvas类,而需要一个midlet外包类来调用canvas类创建,
其方法也不过一个midlet框架,在其startApp()中调用Canvas实例类。
框架代码如下:
   import    javax.microedition.midlet. * ;  
  
import    javax.microedition.lcdui. * ;  
   
  
public     class    testCanvas  extends  MIDlet{  

  
private    Display   display;  

  
public    testCanvas()
  {  
     display
= Display.getDisplay( this );  
  }  

  
public     void    startApp()
 { 
     //这里调用canvas实例类,在独立一个同目录minicolorchooser.java文件。
     MiniColorChooser testCanvas 
=   new  MiniColorChooser();
     display.setCurrent(testCanvas);
  }
  
  
public     void    pauseApp(){  
   
  }  
  
public     void    destroyApp( boolean    unconditional){                                                        
  }  

  }

其中MiniColorChooser.java文件代码如下,加了注释,

import  javax.microedition.lcdui. * ;

/**
  一个设置手机背景颜色的Canvas实现类
 
*/
public   class  MiniColorChooser  extends  Canvas {

    
/**  条状宽度  */
    
static   final   int  BORDER  =   2 ;

    
/**  颜色条高度  */
    
static   final   int  BAR_H  =   14 ;  


    
int  rgbColor;   
    
int  ndx  =   0 ;

    
public  MiniColorChooser() {
        setColor(
0xffff00 );
    }
    
    
public   void  setColor( int  RGB) {
        rgbColor 
=  RGB  &   0x00ffffff ;
    }

    
/**
      颜色值是这样格式:  0x00RRGGBB
     
*/
    
public   int  getColor() {
        
return  rgbColor;
    }

    
// 画背景,修改界面全在这里
     protected   void  paint(Graphics g) {
        
int  w  =  getWidth();
        
int  h  =  getHeight();

        
int  sample_w  =  w  -   1 ;
        
int  sample_h  =  h  -  ((BAR_H  +  BORDER)  *   3 );       // 界面高- 3* 条状颜色栏
         int  sample_y  =  BORDER;

        
// 调颜色栏的蓝,绿,红的y坐标位置
         int  b_y  =  sample_y  +  sample_h  +  (BORDER  *   2 );
        
int  g_y  =  b_y  +  BAR_H;
        
int  r_y  =  g_y  +  BAR_H;

        
// 先把界面涂为黑板色
        g.setColor( 0x000000 );          
        g.fillRect(
0 0 , w, h);

        
// 再画调色板区域。x0=2,y0=2, x1=背景宽, y1=sample_h
        g.setColor(rgbColor);
        g.fillRect(BORDER, sample_y, sample_w, sample_h);

        
// 画颜色调节栏 ,先蓝色
         int  blue  =  (rgbColor  >>   0 &   0xff ;
        g.setColor(
0 0 255 );
        g.fillRect(
20 , b_y, blue  /   4 10 );

        
// 绿
         int  green  =  (rgbColor  >>   8 &   0xff ;
        g.setColor(
0 255 0 );
        g.fillRect(
20 , g_y, green  /   4 10 );

        
int  red  =  (rgbColor  >>   16 &   0xff ;
        g.setColor(
255 0 0 );
        g.fillRect(
20 , r_y, red  /   4 10 );

        
// 写blue ,green ,red 颜色数值
        g.setColor( 255 255 255 );
        g.drawString(Integer.toString(blue), 
18 , b_y  -   3 , Graphics.RIGHT  |  Graphics.TOP);
        g.drawString(Integer.toString(green), 
18 , g_y  -   3 , Graphics.RIGHT  |  Graphics.TOP);
        g.drawString(Integer.toString(red), 
18 , r_y  -   3 , Graphics.RIGHT  |  Graphics.TOP);

        
// 画调节颜色栏边框,注意,画边框,
        
// ndx = 0,1,2,则分别对应当前激活的调节栏。
         if  (ndx  >=   0 ) {
            
int  y  =  b_y  +  (ndx  *  BAR_H);
            g.drawRect(
20 , y,  63 10 );
        }
    }

    
// 当按键不松时
     public   void  keyRepeated( int  key) 
    {
        keyPressed(key);
    }

    
/**
      按键事件
     
*/
    
protected   void  keyPressed( int  key) {
        
int  action  =  getGameAction(key);
        
int  dir  =   0 ;

        
switch  (action) {
        
case  RIGHT:    // 改变颜色值
            dir  +=   1 ;
            
break ;

        
case  LEFT:
            dir 
-=   1 ;
            
break ;

        
case  UP:
            ndx 
-=   1 ;
            
break ;

        
case  DOWN:
            ndx 
+=   1 ;
            
break ;

        
default :
            
return
        }


        
//  ndx =0,1,2 表示蓝,绿,红三个颜色条件栏
        
//  一个颜色 0xff ff ff, 其第一个ff表示红,2表示绿,3表示蓝,
        
//  通过 >> 方式获取 对应颜色
         if  (ndx  <   0 ) {
            ndx 
=   0 ;
        }
        
else
        
if  (ndx  >   2 ) {
            ndx 
=   2 ;
        }
        
else
        
if  (ndx  >=   0 ) {
            
// 取出对于颜色值,改变
             int  v  =  (rgbColor  >>  (ndx  *   8 ))  &   0xff ;
            v 
+=  (dir  *   0x20 );         // 颜色呈8次递进变化。

            
if  (v  <   0 ) {
                v 
=   0 ;
            }

            
if  (v  >   255 ) {
                v 
=   255 ;
            }

            
int  mask  =   0xff   <<  (ndx  *   8 );
            
// 将改变的颜色值 加到对应位。
            rgbColor  =  (rgbColor  &   ~ mask)  |  (v  <<  (ndx  *   8 ));
        }

        
// 立即重画
        repaint();
    }
}


运行效果如下,


在学习中,看别人的代码细节不是很清楚,如果运行一下,就能理解代码是做什么了。
看来有时看代码,得动手多过几遍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值