kenlistian

勤学多思

  IT博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  412 随笔 :: 0 文章 :: 23 评论 :: 0 Trackbacks

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

在用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(
00, 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(
00255);
        g.fillRect(
20, b_y, blue / 410);

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

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

        
//写blue ,green ,red 颜色数值
        g.setColor(255255255);
        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, 6310);
        }
    }

    
//当按键不松时
    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();
    }
}


运行效果如下,


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










posted on 2008-06-23 21:36 kenlistian 阅读(654) 评论(0)  编辑 收藏 引用 所属分类: Java
只有注册用户登录后才能发表评论。