Listでスクロールバーの幅を変更する

ScrollBarの幅は固定値(ScrollBar.THICKNESS = 16)となっているため、かなりクラスをさかのぼっていかないと変更できないと考えていましたが、発想を変えてScaleXを変更すると、案外簡単に変更可能になりました。

import mx.controls.List;
import mx.controls.scrollClasses.ScrollBar;
import mx.core.EdgeMetrics;

/**
* 縦スクロールバーの太さ(デフォルト1.0)
*/
[Style(name="vScrollBarThickness", type="Number", inherits="no")]
/**
 * 縦スクロールバーの太さをScaleで指定可能なListです。
 * @author s-ohira
 * 
 */
public class AdvancedList extends List
{
	protected var _vScrollBarThickness:Number = 1.0;
	
	[Bindable]
	/**
	 * 縦スクロールバーのスケール
	 * @return 
	 * 
	 */
	public function get vScrollBarThickness():Number{ return _vScrollBarThickness;}
	public function set vScrollBarThickness(val:Number):void{
		if(isNaN(val)) val = 1.0;
		_vScrollBarThickness = val;
	}
		/**
	 * updateDisplayList
	 * @param w
	 * @param h
	 * 
	 */
	protected override function updateDisplayList(w:Number, h:Number):void
	{
		super.updateDisplayList(w,h);
			//スクロールバーの太さをScaleで変える
		if(verticalScrollBar && verticalScrollBar.visible){
			verticalScrollBar.width = ScrollBar.THICKNESS * vScrollBarThickness;
			verticalScrollBar.scaleX = vScrollBarThickness;
		}
	}
	
	/**
	 * viewMetrics
	 * @return 
	 * 
	 */
	public override function get viewMetrics():EdgeMetrics
	{
		var vm:EdgeMetrics = super.viewMetrics;
		
		//スクロールバーの太さの違いを補正する
		if(verticalScrollBar && verticalScrollBar.visible){
			vm.right -= ScrollBar.THICKNESS * (1-vScrollBarThickness);
		}
		return vm;
	}
}

Flex3Beta2にて確認しました。

viewMetricsをオーバーライドして、細くなった分だけずらすのがミソです。
同じようにして、Treeでも適用可能です。