1. 程式人生 > >Flex 自定義ToolTip並動態創建應用

Flex 自定義ToolTip並動態創建應用

繪制矩形 controls raw rri 系統 colors flex div else

Flex中,如果給組件設置了toolTip屬性值,則當鼠標移動到該組件上時,會自動出現tip提示,默認樣式是黃色背景,且只能顯示普通文本。

我們可以繼承系統的ToolTip來實現自己的toolTip組件替換,並實現如下功能: 1、提示文本可以使用html文本(還可以顯示圖片) 2、提示背景使用自定義皮膚(漸變,邊框,半透明背景) 上一張實際應用中的效果圖:

技術分享圖片

一、 自定義提示組件 HtmlToolTip.as

package controller
{
	import mx.controls.ToolTip;
	
	public class HtmlToolTip extends ToolTip
	{
		override protected function commitProperties():void{
			super.commitProperties();
			//轉化為HTML文本
			textField.htmlText = text;
		}
		
//		override protected function createChildren():void{
//			//設置邊框樣式
//			this.setStyle("borderSkin",HtmlToolBorder);
//			this.setStyle("backgroundColors",[0x006699, 0xAEB4E6]);
//			this.setStyle("borderColor",0x5965CC);
//			super.createChildren();
//		}
	}
}

  我沒有對原有的邊框樣式做更改所以註釋掉了一部分代碼。如果需要更改還需要建一個類: HtmlToolBorder.as( 提示組件皮膚)代碼如下:

package controller
{
	import flash.display.GradientType;
	
	import mx.skins.halo.ToolTipBorder;

	//ToolTipBorder是默認的邊框樣式
	public class HtmlToolBorder extends ToolTipBorder{
		override protected function updateDisplayList(unscaledWidth:Number,
													  unscaledHeight:Number):void{
			
			var borderThickness:Number = this.getStyle("borderThickness");
			var borderColor:Number     = this.getStyle("borderColor");
			var backgroundColors:Array = this.getStyle("backgroundColors");
			var backgroundAlpha:Number = this.getStyle("backgroundAlpha");
			
			super.updateDisplayList(unscaledWidth, unscaledHeight);
			
			var w:Number = this.width;
			var h:Number = this.height;
			//清除原背景圖形
			this.graphics.clear();
			//用漸變繪制背景
			this.graphics.beginGradientFill(GradientType.LINEAR,backgroundColors,[1.0,0.5],[0,255]);
			//繪制矩形
			this.graphics.drawRect(0,0,w,h);
			this.graphics.endFill();
			this.alpha = backgroundAlpha;   
			
			//繪制邊框
			this.graphics.lineStyle(borderThickness,borderColor,1);
			this.graphics.moveTo(0,0);
			this.graphics.lineTo(w,0);
			this.graphics.lineTo(w,h);
			this.graphics.lineTo(0,h);
			this.graphics.lineTo(0,0);
		}
	}
}

  準備工作完成。

二、應用

  首先定義一個function:

public static function get_tooltip_msg(n:Object,kind:int):String{
			var Msg:String = "";		
			Msg = "Mote ID: "+n.Moteid_ID;
			if((kind==15||(kind&8)))
				Msg +=(SensingDataFormat.temperature(n)==‘N/A‘?‘‘:("<br/>Temp.: " +SensingDataFormat.temperature(n)));
			if((kind==15||(kind&4)))
				Msg +=(SensingDataFormat.humidity(n)==‘N/A‘?‘‘:("<br/>Hum.: " +SensingDataFormat.humidity(n)));
			if((kind==15||(kind&2)))
				Msg +=(SensingDataFormat.light(n)==‘N/A‘?‘‘:("<br/>Light: " +SensingDataFormat.light(n)));
			if((kind==15||kind&1))
				Msg +=((SensingDataFormat.co2(n)==‘N/A‘|| SensingDataFormat.type(n)==‘N/A‘)?‘‘:("<br/><font color=‘#ff0000‘ size=‘13‘ face=‘Microsoft YaHei‘>"+SensingDataFormat.type(n)+": " +SensingDataFormat.co2(n)+"</font>"));
			return Msg;
		}

 這個方法是包裝了數據格式,裏面含有html代碼。Flex的htmlText 自行百度 一大把,然後怎麽在代碼中應用呢,參見下面的代碼:

protected function startShow_clickHandler(event:MouseEvent):void//show tooltips
			{
				
				for(var e:Object in moteIDMap){
					var i:Image  = e as Image;
					var Msg:String = getMsgByMoteID(moteIDMap[i]);
					
					if(moteToolTipMap[i]==null){					
						
						if((dataT.width-i.x)<100){
							//moteToolTipMap[i] =  ToolTipManager.createToolTip(Msg, i.x-10,i.y+30,null,i) as ToolTip;
							moteToolTipMap[i] = new HtmlToolTip(); 
							moteToolTipMap[i].x = i.x-10;
							moteToolTipMap[i].y = i.y+30
							
						}else{
							//moteToolTipMap[i] =  ToolTipManager.createToolTip(Msg, i.x+30,i.y,null,i) as ToolTip;
							moteToolTipMap[i] = new HtmlToolTip();
							moteToolTipMap[i].x = i.x+30;
							moteToolTipMap[i].y = i.y
						}
						moteToolTipMap[i].text = Msg;
						moteToolTipMap[i].setStyle("styleName", "errorTip");
						moteToolTipMap[i].setStyle("fontSize", "12");
						moteToolTipMap[i].setStyle("backgroundColors",[0x006699, 0xAEB4E6]);
						moteToolTipMap[i].setStyle("borderColor",0x5965CC);
						
					}else{
						
						moteToolTipMap[i].move(i.x+i.width,i.y);	
						moteToolTipMap[i].text = Msg;
					}
					moteToolTipMap[i].depth=3;
					dataT.addElement(moteToolTipMap[i]);
					
					//moteMsgMap[i] = msg;
				}
			}

我們不用 ToolTipManager.createToolTip(Msg, i.x-10,i.y+30,null,i) as ToolTip; 這個方法來創建ToolTip 而是
moteToolTipMap[i] = new HtmlToolTip(); new 了一個我們繼承的ToolTip對象,然後把對應的位置 x,y以及text 放進去
這樣效果就出來了

  


原文出自:www.hangge.com 轉載請保留原文鏈接:http://www.hangge.com/blog/cache/detail_686.html

Flex 自定義ToolTip並動態創建應用