j2me Canvas 闪烁扇形区域

notepads 2009-05-12 05:28:22
我用Graphics的fillArc画了几个扇形,拼成了一个正圆
g.fillArc 填充其中一个扇形,我想让这个区域闪烁起来,以区别这个区域是否被选中
[我的想法是启动一个线程,根据所设置的不同颜色重绘这个区域]
但是一直不闪烁,请求高手支援...
...全文
183 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangc_83 2009-05-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 notepads 的回复:]

我的意思是让那个选中的蓝色区域,颜色不断变化,以达到闪烁的效果。
不知道能看见图片吗?
[/Quote]
那就叫你的美工出张闪的图,2张换着画,包闪~~~
liqia76 2009-05-15
  • 打赏
  • 举报
回复
补充一下
闪烁频率 调下面的 8 改成 4的倍数

b=(b+4)%8;
if(b <4){
liqia76 2009-05-15
  • 打赏
  • 举报
回复
下面的测试通过 直接复制就好了 j2me

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class ARC extends MIDlet {
Display dis;
Myarc mc;
public ARC() {
mc=new Myarc();
dis=Display.getDisplay(this);
dis.setCurrent(mc);
new Thread(mc).start();
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

}
protected void pauseApp() {

}
protected void startApp() throws MIDletStateChangeException {

}
}


class Myarc extends Canvas implements Runnable{
long fpss,fpse,FPS=15;
public void run(){
while(true){
fpss=System.currentTimeMillis();
repaint();
fpse=System.currentTimeMillis();
if((fpse-fpss)<1000/FPS){
try{
Thread.sleep(1000/FPS-fpse+fpss);
}catch(Exception e){}
}
}
}


int b=0;
public void paint(Graphics g){
// g.fillArc(50, 50, 100,100, 0, 90);
// g.fillArc(50,50, 100, 100, 90, 180);
// g.fillArc(50,50, 100, 100, 180, 270);
// g.fillArc(50,50, 100, 100, 270, 360);

for(int i=0;i<4;i++){
g.setColor(0);
g.fillArc(50,50,100,100,i*90,90);
}
b=(b+4)%8;
if(b<4){
g.setColor(255,255,255);
g.fillArc(50,50,100,100,b*90,90);
}
}
public void keyPressed(int key){
switch(key){
case -1:
case -2:
case -3:
case -4:b=(++b)%4;
}
}
}
zhaoyb0319 2009-05-14
  • 打赏
  • 举报
回复
哎,亚日的方法多清楚,明白啊!
就是一个状态的切换
用一个变量去控制它
再加上线程的记录呗!
shally131 2009-05-14
  • 打赏
  • 举报
回复
    protected void paint(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, getWidth(), getHeight());// 绘制背景

// 绘制5个扇形
g.setColor(0xFFFFFF);
// g.fillArc(arg0, arg1, arg2, arg3, arg4, arg5);

// 用与背景相同的颜色,遮住要闪烁的扇形
if (System.currentTimeMillis()%7==3) {//控制闪烁
g.setColor(0xFFFFFF);
//绘制扇形区
// g.fillArc(arg0, arg1, arg2, arg3, arg4, arg5);
}
}
notepads 2009-05-13
  • 打赏
  • 举报
回复
打错字了
2楼:你没有其它线程,run方法没有执行呢, 将“其它”改为"启动"
notepads 2009-05-13
  • 打赏
  • 举报
回复
1楼:当选中的是第0, 3, 6个的时候绘制了一个扇形区域;
2楼:你没有其它线程,run方法没有执行呢,
=======
首先谢谢两位。
不知道两位兄弟明白我的意思了吗?
整个我都画好了,我设置了一个默认选择的区域,用键盘来改变当前选择的区域,我想让这个区域突出显示,
我现在是加深颜色,但这样根本看不出来效果。本身就是用不同颜色来区分不同区域,
现在我主要是想利用线程把选中的区域,让它在两种不同颜色间交换重绘,以达到闪烁的效果
当然不用线程,用其它技术也可以,我只想到了线程.
yangc_83 2009-05-13
  • 打赏
  • 举报
回复
其实答案都出来了
LZ思路还是有问题,
其实就这样
区域1 颜色1
区域2 颜色2
区域3 颜色3
区域4 颜色4
--
用一个变量来存储 选中的区域
当选中区域1: 颜色1和 颜色5交替着画,不选就画颜色1
当选中区域2: 颜色2和 颜色5交替着画,不选就画颜色2
...
------
交替着画,LS的都给出了算法,
建议用7楼的,好实现!




xuyan87101 2009-05-13
  • 打赏
  • 举报
回复
用奇数偶数交替的方法来判断改变你的闪烁,再用sleep来设置你想要的闪烁间隔就可以了
hc0120 2009-05-13
  • 打赏
  • 举报
回复
顶一下
kf156 2009-05-13
  • 打赏
  • 举报
回复
你是想可以同时选取多个扇形是吗?
那你可以用个boolean[] selectedArray 来分别对应所选的扇形
选中后置相应的为true
time++;
g.setColor(0xffffff);
for(int i=0;i<PART_NUM;i++){
if(time%3==0&&selectedArray[i]){
g.setColor(0xff0000);
}
//绘制相应部分的扇形
drawArc(i);
}
prince58 2009-05-13
  • 打赏
  • 举报
回复
只在有PAINT里一会画一会不画(时间间隔可以自己设定)就闪烁,不需要新的线程。

同理可以一会画红色一会画它原来的颜色也实现闪烁了~~~
隧便 2009-05-13
  • 打赏
  • 举报
回复
你说的闪烁是指颜色一直不停的改变?还是只要颜色改掉以区别其他未选中的?
notepads 2009-05-13
  • 打赏
  • 举报
回复

我的意思是让那个选中的蓝色区域,颜色不断变化,以达到闪烁的效果。
不知道能看见图片吗?
JarodYv 2009-05-12
  • 打赏
  • 举报
回复
简单的说,就是用一个与北京颜色一致的等下小的扇形遮住要闪烁的扇形,下面是示例代码,扇形绘制部分的代码需要楼主自己去实现

public class TestCanvas extends Canvas implements Runnable {

private static final int PART_NUM = 5;// 假设这个圆被分成了5部分
private boolean isRunning = true;// 标识线程是否运行
private int times = 0;// 标示重绘的次数。
private int selectedIndex = 0;// 表示选中的是整圆的第几部分

protected void paint(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, getWidth(), getHeight());// 绘制背景

// 绘制5个扇形
g.setColor(0xFFFFFF);
g.fillArc(arg0, arg1, arg2, arg3, arg4, arg5);

// 用与背景相同的颜色,遮住要闪烁的扇形
if (times % 2 == 0) {
g.setColor(0xFFFFFF);
g.fillArc(arg0, arg1, arg2, arg3, arg4, arg5);
}
}

protected void keyPressed(int keyCode) {
keyCode = getGameAction(keyCode);
switch (keyCode) {
case Canvas.UP:
case Canvas.LEFT:
selectedIndex = --selectedIndex < 0 ? 0 : PART_NUM - 1;
break;
case Canvas.DOWN:
case Canvas.RIGHT:
selectedIndex = ++selectedIndex >= PART_NUM ? 0 : selectedIndex;
break;
}
}

public void run() {
while (isRunning) {
times++;// 重绘次数加1
repaint();// 重绘
try {
Thread.sleep(100L);// 假设100ms重绘一次
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
kf156 2009-05-12
  • 打赏
  • 举报
回复
简单一点的方法就是用个int变量
比如
int time;
public void paint(Graphics g){
time++;
g.setColor(0);
g.fillArc();//第一个扇形
g.fillArc();//第二个扇形
……//其N个扇形

if(time%3==0)
g.setColor(0xffffff);
g.fillArc();//你想闪烁显示的扇形 

}

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧