blackBerry 做 tabpanel 效果

来源:互联网 发布:python多进程并发框架 编辑:程序博客网 时间:2024/04/28 04:20

 基本思路:重写BitmapField做tabpanel的选项卡,下面放一个Manager,bitmapField获得焦点的时候修改Manager的内容,代码如下:

TabPanel.java

 

 

CustomBitmapField.java

<textarea cols="87" rows="15" name="code" class="java">/*** @author daoying*/import net.rim.device.api.system.Bitmap;import net.rim.device.api.ui.component.BitmapField;public class CustomBitmapField extends BitmapField{private TabScreen tab;private int tabIndex;public CustomBitmapField(Bitmap bitmap, long style, TabScreen tab){super(bitmap, style);this.tab = tab;}protected void onFocus(int direction){System.out.println("I am on focus tabindex = " + tabIndex);System.out.println("I am on focus direction = " + direction);tab.changeOnFocus(tabIndex, true);}protected void onUnfocus(){//change the tabItemSystem.out.println("I am lose Focus tabindex = " + tabIndex);tab.changeOnUnfocus();}protected boolean navigationClick(int status,int time){System.out.println("you click me");return true;}protected void invalidate(){super.invalidate();}public int getTabIndex() {return tabIndex;}public void setTabIndex(int tabIndex) {this.tabIndex = tabIndex;}}</textarea>

 

TabScreen.java

 <textarea cols="87" rows="14" name="code" class="java">/*** @author daoying*/import net.rim.device.api.system.Bitmap;import net.rim.device.api.ui.Field;import net.rim.device.api.ui.Graphics;import net.rim.device.api.ui.MenuItem;import net.rim.device.api.ui.component.Dialog;import net.rim.device.api.ui.component.RichTextField;import net.rim.device.api.ui.container.HorizontalFieldManager;import net.rim.device.api.ui.container.MainScreen;import net.rim.device.api.ui.container.VerticalFieldManager;public class TabScreen extends MainScreen{//the file's directionprivate static final String BODY_FILE_NAME_FOCUS = "tab11.png";private static final String CONVERSATION_FILE_NAME_FOCUS = "tab21.png";private static final String GROUP_FILE_NAME_FOCUS = "tab31.png";private static final String BODY_FILE_NAME_UNFOCUS = "tab12.png";private static final String CONVERSATION_FILE_NAME_UNFOCUS = "tab22.png";private static final String GROUP_FILE_NAME_UNFOCUS = "tab32.png";// the tab indexprivate static final int BODY_INDEX = 1;private static final int CONVERSATION_INDEX = 2;private static final int GROUP_INDEX = 3;//alpha valueprivate static final int ALPHA_VALUE_FOCUS = 30;private static final int ALPHA_VALUE_UNFOCUS = 100;private Bitmap bodyBitmap;private Bitmap conversationBitmap;private Bitmap groupBitmap;private CustomBitmapField bodyBitmapField;private CustomBitmapField conversationBitmapField;private CustomBitmapField groupBitmapField;private HorizontalFieldManager hfm;private MenuItem menuItem;private Graphics g;private VerticalFieldManager workArea;private VerticalFieldManager bodyManager;private VerticalFieldManager conversationManager;private VerticalFieldManager groupManager;private static int tabIndex;private boolean isFocusTab = true;public TabScreen(){hfm = new HorizontalFieldManager();bodyBitmap = new Bitmap(100, 40);conversationBitmap = new Bitmap(100, 40);groupBitmap = new Bitmap(100, 40);bodyBitmapField = drawTabItem(bodyBitmap, null, BODY_FILE_NAME_UNFOCUS, ALPHA_VALUE_UNFOCUS);conversationBitmapField = drawTabItem(conversationBitmap, null, CONVERSATION_FILE_NAME_UNFOCUS, ALPHA_VALUE_UNFOCUS);groupBitmapField = drawTabItem(groupBitmap, null, GROUP_FILE_NAME_UNFOCUS, ALPHA_VALUE_UNFOCUS);bodyBitmapField.setTabIndex(BODY_INDEX);conversationBitmapField.setTabIndex(CONVERSATION_INDEX);groupBitmapField.setTabIndex(GROUP_INDEX);workArea = new VerticalFieldManager();workArea.setPadding(5, 0, 0, 5);bodyManager = new VerticalFieldManager();conversationManager = new VerticalFieldManager();groupManager = new VerticalFieldManager();RichTextField bodyTf = new RichTextField("body");RichTextField conversationTf = new RichTextField("conversation");RichTextField groupTf = new RichTextField("group");bodyManager.add(bodyTf);conversationManager.add(conversationTf);groupManager.add(groupTf);hfm.add(bodyBitmapField);hfm.add(conversationBitmapField);hfm.add(groupBitmapField);//add the test menuItemmenuItem = new MenuItem("Hello", 100000, 10){public void run(){Dialog.alert("here");}};add(hfm);add(workArea);addMenuItem(menuItem);bodyBitmapField.setFocus();tabIndex = 1;}private CustomBitmapField drawTabItem(Bitmap image, CustomBitmapField imageField, String fileName, int alpha){int imageW = image.getWidth();int imageH = image.getHeight();if(imageField == null){imageField = new CustomBitmapField(image,Field.FOCUSABLE, this);}imageField.setPadding(0, 0, 0, 5);Bitmap imageBitmap = Bitmap.getBitmapResource(fileName);int bitmapW = imageBitmap.getWidth();int bitmapH = imageBitmap.getHeight();g = new Graphics(image);g.clear();g.setGlobalAlpha(alpha);g.fillRect(0, 0, 100, 40);g.setGlobalAlpha(255);g.drawBitmap((imageW - bitmapW)/2, (imageH - bitmapH)/2, bitmapW, bitmapH, imageBitmap, 0, 0);imageField.invalidate();return imageField;}/** * * @param index * @param focus true -&gt; focus, false -&gt;onFocus */public void changeOnFocus(int index, boolean focus){if(isFocusTab){if(tabIndex != index){switch(tabIndex){case BODY_INDEX:drawTabItem(bodyBitmap, bodyBitmapField, BODY_FILE_NAME_UNFOCUS, ALPHA_VALUE_UNFOCUS);workArea.deleteAll();break;case CONVERSATION_INDEX:drawTabItem(conversationBitmap, conversationBitmapField, CONVERSATION_FILE_NAME_UNFOCUS, ALPHA_VALUE_UNFOCUS);workArea.deleteAll();break;case GROUP_INDEX:drawTabItem(groupBitmap, groupBitmapField, GROUP_FILE_NAME_UNFOCUS, ALPHA_VALUE_UNFOCUS);workArea.deleteAll();break;}switch(index){case BODY_INDEX:drawTabItem(bodyBitmap, bodyBitmapField, BODY_FILE_NAME_FOCUS, ALPHA_VALUE_FOCUS);workArea.add(bodyManager);break;case CONVERSATION_INDEX:drawTabItem(conversationBitmap, conversationBitmapField, CONVERSATION_FILE_NAME_FOCUS, ALPHA_VALUE_FOCUS);workArea.add(conversationManager);System.out.println("notgnadhfkahdkfhadkadfsdfh");break;case GROUP_INDEX:drawTabItem(groupBitmap, groupBitmapField, GROUP_FILE_NAME_FOCUS, ALPHA_VALUE_FOCUS);workArea.add(groupManager);break;}tabIndex = index;}}else{switch(tabIndex){case BODY_INDEX:isFocusTab = true;bodyBitmapField.setFocus();break;case CONVERSATION_INDEX:isFocusTab = true;conversationBitmapField.setFocus();break;case GROUP_INDEX:isFocusTab = true;groupBitmapField.setFocus();break;}}}public void changeOnUnfocus(){Object oo = this.getFieldWithFocus();if(oo instanceof VerticalFieldManager){isFocusTab = false;}}public boolean isFocusTab() {return isFocusTab;}public void setFocusTab(boolean isFocusTab) {this.isFocusTab = isFocusTab;}}</textarea>

 

 

测试时自己先找六张图片,大小不要超过100*40,建议50*50左右的图片,测试机器屏幕为320*240