站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题J2ME开发,跪求如何全屏显示图片!不分任何手机型号!

J2ME开发,跪求如何全屏显示图片!不分任何手机型号!

摘要: J2ME开发,跪求如何全屏显示图片!不分任何手机型号!


我目前的代码如下
ClientMIDlet.java文件如下:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class ClientMIDlet extends MIDlet implements Runnable{

public static Display display;
public static ClientMIDlet instance=null;
public static int count=0;

public static MainCanvas mainCanvas=null;


public ClientMIDlet(){
instance=this;
display=Display.getDisplay(this);
mainCanvas=new MainCanvas();
display.setCurrent(mainCanvas);
new Thread(this).start();
}

public void run(){
while(true){
mainLoop();
try{
Thread.sleep(80);
}catch(Exception e){}
}
}
public void mainLoop(){

mainCanvas.repaint();
count++;
if(count==100){
count=0;
}
}

public void startApp(){
}
public void pauseApp(){
}
public void destroyApp(boolean unconditional){
count=0;
}
}

////////////////////////////////////////////////////////
MainCanvas.java代码如下:
/*
* MainCanvas.java
*
* Created on 2006年7月13日, 下午4:08
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

/**
*
* @author paisheng
*/
import javax.microedition.lcdui.*;
class MainCanvas extends Canvas implements CommandListener{
static int SCREEN_WIDTH,SCREEN_HEIGHT;
Command Cmd_ok,Cmd_logout,Cmd_cancle;
/**避免重复*/
boolean b;
Image imgItem[]=new Image[9];
Image bg;
int curX,curY;

MainCanvas(){
SCREEN_WIDTH=getWidth();
SCREEN_HEIGHT=getHeight();

try{
bg=Image.createImage("/bg.png");
for(int i=0;i imgItem[i]=Image.createImage("/"+i+".png");
}catch(Exception e){System.out.println("err:"+e);}

Cmd_ok=new Command("确定",Command.OK,1);
Cmd_cancle = new Command("取消",Command.CANCEL,1);
addCommand(Cmd_ok);
addCommand(Cmd_cancle);
setCommandListener(this);
}

public void commandAction(Command c,Displayable d){
if(c==Cmd_ok){
if(!b){
b=true;
int id=curX+curY*3;
if(id==0){

}else if(id==1){

}else if(id==2){

}else if(id==3){//消息

}else if(id==4){//

}else if(id==5){//

}else if(id==6){

}else if(id==7){

}else if(id==8){

}
System.out.println(id);
b=false;
}
}
}

public void paint(Graphics g){
g.setColor(0xffffff);
g.fillRect(0,0,getWidth(),getHeight());
g.drawImage(bg,0,0,0);
for(int i=0;i<3;i++){//row
for(int j=0;j<3;j++){//col
if(i*3+j if(curX+curY*3==i*3+j){
if(ClientMIDlet.count%8<2){
drawPic(1+j*58,i*48,0,0,58,48,imgItem[i*3+j],g);
}else if(ClientMIDlet.count%8<5){
drawPic(1+j*58,i*48,58,0,58,48,imgItem[i*3+j],g);
}else{
drawPic(1+j*58,i*48,58*2,0,58,48,imgItem[i*3+j],g);
}
}else{
drawPic(1+j*58,i*48,0,0,58,48,imgItem[i*3+j],g);
}
}
}
}

}
private void drawPic(int sx, int sy,int px ,int py, int pw, int ph,Image img,Graphics g){
g.setClip(sx,sy,pw,ph);
g.drawImage(img,sx-px,sy-py,20);
g.setClip(0,0,getWidth(),getHeight());
}

public void keyPressed(int keyCode){
if (keyCode == KEY_NUM2 || keyCode == -1) {
curY--;
if(curX+curY*3<0){
curY=imgItem.length/3;
if(curX+curY*3>=imgItem.length){
curY-=1;
}
}
}else if (keyCode == KEY_NUM8 || keyCode == -2) {
curY++;
if(curX+curY*3>=imgItem.length){
curY=0;
}
}else if (keyCode == KEY_NUM4 || keyCode == -3) {
curX--;
if(curX+curY*3<0){
curX=imgItem.length%3-1;
curY=imgItem.length/3;
}else{
if(curX<0){
curX=2;
curY--;
if(curX+curY*3<0){
curX=imgItem.length%3-1;
curY=imgItem.length/3;
}
}
}

}else if (keyCode == KEY_NUM6 || keyCode == -4) {
curX++;
if(curX+curY*3>=imgItem.length){
curX=0;
curY=0;
}else{
if(curX>2){
curX=0;
curY++;
if(curX+curY*3>=imgItem.length){
curX=0;
curY=0;
}
}
}
}
}

public void showNotify(){

}
public void hideNotify(){

}

}


现在的图片都是174*144的!
屏幕大点的手机,就不能全屏显示图片!
这是个正方形的9格图片
希望大虾能帮我想想如何不分手机型号,都让这9格图片全屏显示~!
谢谢各位大哥大姐了!
实在不好意思,不知道为啥今天只能给30分了!这破CSDN不知道怎么算这分!
本人QQ 504655474
或者EMAIL liuyin_jay@yahoo.com.cn
MSN liuyin_jay@yahoo.com.cn



MIDP2.0:Canvas类的setFullScreenMode方法
Nokia:FullCanvas类

其他的不能全屏


我粗粗看了一下楼主的程序,好像是通过计算坐标把屏幕切分成 9 格,然后在每个格里显示一个图片。但你现在切分 9 格时是用固定坐标值计算的。

如果你在切分 9 格时用屏幕尺寸来做,不就可以“全屏”了吗?


setFullScreenMode(true);


maquan('ma:kju)的说法,有点那个意思!
其他的setFullScreenMode我也有试过,是可以全P,但是图片大小没有变!小的可怜哦~
maquan('ma:kju)能帮我写一下大概代码吗?我QQ504655474
切分 9 格时用屏幕尺寸来做!屏幕尺寸怎么取得呢?


建议用Polish来预编译,就能处理不同屏幕大小的机型。


大哥,不明白,说的通俗点行么?我是超级菜鸟班的!


不用第三方软件 能实现全屏吗? nokia有个fullcanvas


大哥大姐们。能不能再说的详细些,小妹我J2EE还能理解,J2ME实在是没接触过啊~拜托各位了


> 切分 9 格时用屏幕尺寸来做!屏幕尺寸怎么取得呢?

其实我也不是很清楚,不过你程序中那个 getWidth()、getHeight() 不是吗?


> 不用第三方软件 能实现全屏吗? nokia有个fullcanvas

我估计楼主这个帖子里所谓的“全屏”应该是指对于不同屏幕尺寸的手机都能使用其可供使用的最大屏幕空间。你说的那个“全屏”应该是连手机图标什么的都给它覆盖掉。


楼主是不是全屏是有了
分九格也做到了
就是没格里面的图片很小啊
如果是这样要自己写代码放大图片了



> 是可以全P,但是图片大小没有变!小的可怜哦~

找遍了 API,也没看见能做图片缩放的方法。楼主能不能将就一下,把图片显示在格子的中央,这样就算小一点也不会太难看喽 ^_^ 或者,反过来想想,把图片做得大一点,这样在小屏幕的时候损失点四边。

否则,就找找看有没有第三方的类库能做图片缩放的。


搂主,就像zitengxin说的那样,你可以写代码把图片放大的,不要分成9个格子,而是一个像素一个像素的画,通过屏幕的长宽来决定每个象素画的位置和次数。就是一个简单的放大图片的函数


marsgongna() SAY:
楼主是不是全屏是有了
分九格也做到了
就是没格里面的图片很小啊
如果是这样要自己写代码放大图片了


可以放大图片吗?是不是有个拉伸图片的方法?能教教我么?或者发个例子到我邮箱
liuyin_jay@yahoo.com.cn
麻烦前辈了,哈哈!
这个邮箱也是我MSN,方便交流!谢谢各位啊!谢谢


支持MIDP2.0 GameCanvas
不支持MIDP2.0 Nokia S40 S60。。开发包 FullCanvas

任意型号手机,不可能


晕,那可怎么好?


无论在midp1.0还是在midp2.0中,系统都没有给我们提供对图片进行伸缩操作的api.但是其实我们只要在程序代码中略施小计,就能达到这个效果,只是效果要比美术做出来的图片,呵呵,差多啦,同时也会造成性能损失。伸缩图片的构造原理就是简单沿x,y轴按比例放缩,比如说我们需要把一张16*16的png图片转化成一张32*32的图片,那么我们可以先对该图片做一个水平方向上的拉伸操作,然后再把水平拉伸后的图片按垂直方向再做一次拉伸操作。做拉伸操作时,比如水平方向上,我们需要构造一张32*16的mutable Image,获取其Graphics,利用该Graphics,绘制该mutable Graphics的每一列像素,这一列像素就来自于原始图片中的按比例对应的某一列像素。垂直方向上的拉伸操作也是如法炮制。因为是一种按比例的对应关系,图像的缩小操作也可按该办法进行。

  好了,我们来看代码
  import javax.microedition.lcdui.Graphics;
  import javax.microedition.lcdui.Image;
  /**
  * 图像工具类
  * @author Jagie
  *
  */
  public class ImageUtil {
  /**
  * 图像放缩方法
  * @param srcImage 原始的Image对象
  * @param newW 放缩后的Image的宽度
  * @param newH 放缩后的Image的高度
  * @return 放缩后的Image对象
  */
  
  public static final Image scale (Image srcImage, int newW, int newH) {
  int srcW = srcImage.getWidth();
  int srcH = srcImage.getHeight();
  //先做水平方向上的伸缩变换
  Image tmp = Image.createImage(newW, srcH);
  Graphics g = tmp.getGraphics();
  for (int x = 0; x < newW; x++) {
  g.setClip(x, 0, 1, srcH);
  //按比例放缩
  g.drawImage(srcImage,x-x*srcWnewW,0,Graphics.LEFT | Graphics.TOP);
  }
  //再做垂直方向上的伸缩变换
  Image dst = Image.createImage(newW, newH);
  g = dst.getGraphics();
  for (int y = 0; y < newH; y++) {
  g.setClip(0, y, newW, 1);
  //按比例放缩
  g.drawImage(tmp,0,y-y*srcHnewH,Graphics.LEFT | Graphics.TOP);
  
  }
  return dst;
  }
  }
  也许有人会提出疑问,既然是按x,y方向按等比例放缩,那我写成这样岂不是代码更简洁:
  public static final Image scale2(Image srcImage, int newW, int newH) {
  int srcW = srcImage.getWidth();
  int srcH = srcImage.getHeight();
  
  Image dst=Image.createImage(newW,newH);
  Graphics g=dst.getGraphics();
  for (int x = 0; x < newW; x++) {
  for (int y = 0; y < newH; y++) {
  g.setClip(x, y, 1, 1);
  g.drawImage(srcImage, x-x*srcWnewW, y - y * srcH / newH, Graphics.LEFT
  | Graphics.TOP);
  }
  }
  return dst;
  }
  这种做法效果上和前者无异,但是并不可取,只要算算它的时间复杂度就知道,基本上是前者的平方。在我的机器上,做一次全屏幕的放缩操作,前者耗时60ms,而后者耗时7150ms。


可能效果没有原来的好呢~~~


帮MM顶.加油.


顶,俺也不知道这个方法列,学习


给你两个方法吧,不过效率上可能不同。 都是实现图片的缩小和放大的。

--------------------Method_1------------------------------------
// 调整图片的大小
private Image creatNewImg(Image image) {

int sourceWidth = image.getWidth ();
int sourceHeight = image.getHeight ();
// 设置缩小图的宽度;
int newWidth = 168;
int newHeight = 168;
// if (newHeight == -1)
// //计算缩小图的高度
// newHeight = newWidth * sourceHeight / sourceWidth;
Image newImg = Image.createImage (newWidth, newHeight);
Graphics g = newImg.getGraphics ();
for(int y = 0; y < newHeight; y += 2) {
for(int x = 0; x < newWidth; x += 2) {
g.setClip (x, y, 2, 2);
int dx = x * sourceWidth / newWidth;
int dy = y * sourceHeight / newHeight;
// 按照比例计算原图片中的像素
g.drawImage (image, x - dx, y - dy, Graphics.LEFT
| Graphics.TOP);
}
}
Image fitImg = Image.createImage (newImg);
return fitImg;
}
------------------------End Method_1--------------------------------------


-------------------------Method_2------------------------------------------
//////////////////////////简单应用///////////////////////////////////////////////////////////////////////////
Image img1;//原图
Image img2;//修改后的图
int x;
int y;
int rW;//修改后的图像宽
int rY;//修改后的图象高
try
{
img1 = Image.createImage("/ff.png");
}catch(Exception e){}

public void drawResizeImg(Graphics g)
{
g.draw(img1,x,y,0);//画原图
img2 = resizeImage(img1,rW,rH,0/*模式参数取值0或1*/);//用resizeImage方法生成新图象 rW,rH分别为宽 高
g.draw(img2,x,y+100,0);//画新图
}
/////////////////////////////////////////////////////////////////////////////////////////////////////






// 固定点常量
/*
*这几个参数必须
*
*/
private static final int FP_SHIFT = 13;
private static final int FP_ONE = 1 << FP_SHIFT;
private static final int FP_HALF = 1 << (FP_SHIFT - 1);

// 采集模式 - resizeImage() 中模式的有效参数
// 默认的模式可以为 MODE_BOX_FILTER 因为在resizeImage()被实现
public static final int MODE_POINT_SAMPLE = 0;
public static final int MODE_BOX_FILTER = 1;

/**
*得到像素
*将一个图像对象传入,将返回一个int型的像素数组。
*/
int[] getPixels(Image src) {
int w = src.getWidth();
int h = src.getHeight();
int[] pixels = new int[w * h];
src.getRGB(pixels,0,w,0,0,w,h);
return pixels;
}

/**
* 这个方法,可以用一个已有的像素数组,生成一个新的图象对象
*/
Image drawPixels(int[] pixels, int w, int h) {
return Image.createRGBImage(pixels,w,h,true);
}

/**
* resizeImage
* 传入已有图象作为参数,并且给出修改的参数,生成新的图象
* @参数 src 图形对象
* @参数 destW 目标图象的宽
* @参数 destH 目标图象的高
* @参数 mode 表示生成新图象的两种模式:
* MODE_POINT_SAMPLE - point sampled resizing, and MODE_BOX_FILTER - box filtered resizing (default).
* -点采样- -盒过滤-(默认)
* @返回一个修改后的图象.
*/
Image resizeImage(Image src, int destW, int destH, int mode) {
int srcW = src.getWidth();
int srcH = src.getHeight();

// 建立像素数组
int[] destPixels = new int[destW * destH]; // 目标图象的像素数组
int[] srcPixels = getPixels(src); // 源图像的像素数组

if (mode == MODE_POINT_SAMPLE) {
// 单点采样模式
// 遍历目标像素组,源像素经放大
for (int destY = 0; destY < destH; ++destY) {
for (int destX = 0; destX < destW; ++destX) {
int srcX = (destX * srcW) / destW;
int srcY = (destY * srcH) / destH;
destPixels[destX + destY * destW] = srcPixels[srcX + srcY * srcW];
}
}
}
else {
//源图象的密度系数
int ratioW = (srcW << FP_SHIFT) / destW;
int ratioH = (srcH << FP_SHIFT) / destH;

int[] tmpPixels = new int[destW * srcH]; // 水平重采样的临时缓存

// 执行添加混合的参数
int argb; // 源图象的提取颜色值
int a, r, g, b; // 被分的颜色通道
int count; //采样像素的平均值

// 重采样被分为简单的两步
// 第一步 将保持相同的高度 水平拉伸
// 第二步 垂直拉伸

// 水平采样
for (int y = 0; y < srcH; ++y) {
for (int destX = 0; destX < destW; ++destX) {
count = 0; a = 0; r = 0; b = 0; g = 0; //初始化颜色值
int srcX = (destX * ratioW) >> FP_SHIFT; // 计算开始采样
int srcX2 = ((destX + 1) * ratioW) >> FP_SHIFT; //计算计算采样

// 循环 并且添加颜色值到通道
do {
argb = srcPixels[srcX + y * srcW];
a += ((argb & 0xff000000) >> 24); // alpha 通道
r += ((argb & 0x00ff0000) >> 16); // 红色通道
g += ((argb & 0x0000ff00) >> 8); // 绿色通道
b += (argb & 0x000000ff); // 蓝色 通道
++count; // 像素的计算
++srcX; //移动到下一个像素
}
while (srcX <= srcX2 && srcX + y * srcW < srcPixels.length);

// 平均通道值
a /= count;
r /= count;
g /= count;
b /= count;

// 重建颜色通道值并放入缓存中
tmpPixels[destX + y * destW] = ((a << 24) | (r << 16) | (g << 8) | b);
}
}
// 垂直采样 (水平采样已经完成)
System.out.println("Vertical resampling...");
for (int x = 0; x < destW; ++x) {
for (int destY = 0; destY < destH; ++destY) {
count = 0; a = 0; r = 0; b = 0; g = 0; // initialize color blending vars
int srcY = (destY * ratioH) >> FP_SHIFT; // calculate beginning of sample
int srcY2 = ((destY + 1) * ratioH) >> FP_SHIFT; // calculate end of sample

// 循环 并且添加颜色值到通道
do {
argb = tmpPixels[x + srcY * destW];
a += ((argb & 0xff000000) >> 24); // alpha 通道
r += ((argb & 0x00ff0000) >> 16); // 红色通道
g += ((argb & 0x0000ff00) >> 8); // 绿色通道
b += (argb & 0x000000ff); //蓝色 通道
++count; // 像素的计算
++srcY; //移动到下一个像素
}
while (srcY <= srcY2 && x + srcY * destW < tmpPixels.length);

// 平均通道值
a /= count; a = (a > 255) ? 255 : a;
r /= count; r = (r > 255) ? 255 : r;
g /= count; g = (g > 255) ? 255 : g;
b /= count; b = (b > 255) ? 255 : b;

// 重建颜色通道值并放入缓存中
destPixels[x + destY * destW] = ((a << 24) | (r << 16) | (g << 8) | b);
}
}
}

// 用新的缓存返回新图象
return drawPixels(destPixels,destW,destH);
}
----------------------------------End Method_2--------------------------


太复杂了。啊,我这菜鸟太菜了55555555555555555
感觉KJAVA怎么这么难弄啊?人都说KJAVA比JAVA简单!我看来,KJAVA就是无字天书似的。55555555一窍不通啊


很深奥!!!


↑返回目录
前一篇: 我的程序放到手机上点击WAP连接,选择否,返回到住CANVERS再点选项就没反映了
后一篇: 主线程和子线程的关系