HScene間の重ね合わせ制御

指定したHSceneを最前面に表示するHScene.show()メソッドのサンプルコード。
本サンプルでは、一部が重なり合った2つのHSceneが交互に最前面に表示される。

 

なお、本サンプルを動作させるためには、BD-J Object fileに本サンプルを2つ登録し、それぞれ奇数、偶数のapplication_idを割り振る必要がある。

 

Main.java

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
 
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
 
import org.havi.ui.HScene;
import org.havi.ui.HSceneFactory;
import org.havi.ui.HSceneTemplate;
 
public class Main extends Component implements Xlet{
    int x, y, w = 960, h = 540;
    int count = 0;
    int appID;
    public void initXlet(XletContext xc){
        try {
            appID = Integer.parseInt1)String) xc.getXletProperty("dvb.app.id"), 16);
            if( ( appID%2 ) == 0 ){  // application_idに応じて表示位置をずらしている
                x = 480-240; y = 270-135;
            } else {
                x = 960-240; y = 540-135;
            }
            // HSceneを取得
            HSceneFactory hsf= HSceneFactory.getInstance();
            HSceneTemplate hst = new HSceneTemplate();
            hst.setPreference(HSceneTemplate.SCENE_PIXEL_DIMENSION,
                    new Dimension(w, h),
                    HSceneTemplate.REQUIRED);
            hst.setPreference(HSceneTemplate.SCENE_PIXEL_LOCATION,
                    new Point(x, y),
                    HSceneTemplate.REQUIRED);
            HScene hs = hsf.getBestScene(hst);
            this.setBounds(new Rectangle(0,0,w,h;
            hs.add(this);
            if( ( appID%2 ) == 0 ){ // application_idに応じて開始タイミングをずらしている
                Thread.sleep(1000);
            }
            hs.setVisible(true);
            for( ;; ){
                hs.show(); // 自アプリのHSceneを最前面にしてrepaint
                // hs.repaint();
                count++;
                Thread.sleep(2000);
            }
        } catch (Throwable thr){
        }
    }
    public void paint(Graphics g ){
        if( ( appID%2 ) == 0 ){
            g.setColor(Color.blue);
        } else {
            g.setColor(Color.red);
        }
         g.fillRect(0, 0, w, h);
         g.setColor(Color.white);
         g.setFont(new Font(null, Font.BOLD, 48));
         g.drawString(Integer.toString(count), 100, 100);
         g.drawString(Integer.toString(count), w-100, h-100);
    }
    public void startXlet(){}
    public void pauseXlet(){}
    public void destroyXlet(boolean unconditional){}
}

関連する項目

   [ + ]

1. String) xc.getXletProperty("dvb.app.id"), 16); if( ( appID%2 ) == 0 ){ // application_idに応じて表示位置をずらしている x = 480-240; y = 270-135; } else { x = 960-240; y = 540-135; } // HSceneを取得 HSceneFactory hsf= HSceneFactory.getInstance(); HSceneTemplate hst = new HSceneTemplate(); hst.setPreference(HSceneTemplate.SCENE_PIXEL_DIMENSION, new Dimension(w, h), HSceneTemplate.REQUIRED); hst.setPreference(HSceneTemplate.SCENE_PIXEL_LOCATION, new Point(x, y), HSceneTemplate.REQUIRED); HScene hs = hsf.getBestScene(hst); this.setBounds(new Rectangle(0,0,w,h

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.