HDMI添加縮放功能

HDMI顯示在電腦顯示屏顯示正常,但是插入電視,部分電視顯示不全,官方解釋是說有些屏不處理oversceen包,這種情況需要手動調節屏幕的可視區域。
1、Settings.java

public static final String HDMI_DEFAULLT_TV_WIDTH ="hdmi_default_tv_width";
public static final String HDMI_DEFAULLT_TV_HEIGTH ="hdmi_default_tv_heigth";

2、DatabaseHelper.java

loadIntegerSetting(stmt, Settings.System.HDMI_DEFAULLT_TV_WIDTH,
R.integer.def_hdmi_tv_width);
loadIntegerSetting(stmt, Settings.System.HDMI_DEFAULLT_TV_HEIGTH,
R.integer.def_hdmi_tv_heigth);

3、mtk_defaults.xml

<integer name="def_hdmi_tv_width">0</integer>
<integer name="def_hdmi_tv_heigth">0</integer>

4、DisplayManagerService.java

import android.content.ContentResolver;
import android.database.ContentObserver;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException; //導入包
…………
/// M:[SmartBook]Recording the extra display device id
private static int mExtraDisplayId = -1;
private int hdmiSceenHeight;
private int hdmiSceenwigth;
class SettingsObserver extends ContentObserver{ //監聽寬高改變
SettingsObserver(Handler handler){
super(handler);
}
void observe(){
ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(Settings.System.getUriFor(Settings.System.HDMI_DEFAULLT_TV_WIDTH),false,this);
resolver.registerContentObserver(Settings.System.getUriFor(Settings.System.HDMI_DEFAULLT_TV_HEIGTH),false,this);
update();
}
@Override public void onChange(boolean selfChange){
update();
}
public void update(){
ContentResolver resolver = mContext.getContentResolver();
try{
hdmiSceenHeight = Settings.System.getInt(resolver,Settings.System.HDMI_DEFAULLT_TV_HEIGTH);
hdmiSceenwigth = Settings.System.getInt(resolver,Settings.System.HDMI_DEFAULLT_TV_WIDTH);
synchronized(mSyncRoot){
scheduleTraversalLocked(false);
}
}catch(SettingNotFoundException e){
Slog.e(TAG,"hdmi SettingNotFoundException:"+e);
}
}
}
public void systemReady(boolean safeMode, boolean onlyCore) {
synchronized (mSyncRoot) {
mSafeMode = safeMode;
mOnlyCore = onlyCore;
}
mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS);
//add by peng : add hdmi srceen zoom
SettingsObserver observer = new SettingsObserver(new Handler());
observer.observe();
//add by peng : end
}

private void configureDisplayInTransactionLocked(DisplayDevice device) {
……
boolean isBlanked = (mAllDisplayBlankStateFromPowerManager == DISPLAY_BLANK_STATE_BLANKED)
&& (info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0;
//add by peng:add hdmi zoom
display.configureDisplayInTransactionLocked(device, isBlanked ,hdmiSceenHeight,hdmiSceenwigth);
//add by peng@end
……
}

5、LogicalDisplay.java
public void configureDisplayInTransactionLocked(DisplayDevice device,
boolean isBlanked,int hdmiSceenHeight,int hdmiSceenweight) {
if (physWidth * displayInfo.logicalHeight
< physHeight * displayInfo.logicalWidth) {
// Letter box.
displayRectWidth = physWidth;
displayRectHeight = displayInfo.logicalHeight * physWidth / displayInfo.logicalWidth;
} else {
// Pillar box.
displayRectWidth = displayInfo.logicalWidth * physHeight / displayInfo.logicalHeight;
displayRectHeight = physHeight;
}
if (displayDeviceInfo.type == Display.TYPE_HDMI) {
displayRectWidth = physWidth - hdmiSceenweight;
displayRectHeight = physHeight - hdmiSceenHeight;
}

6、settings部分很簡單,搞兩個進度條,寬和高,拖動的時候 把值設置到Settings.System.HDMI_DEFAULLT_TV_WIDTH 和 Settings.System.HDMI_DEFAULLT_TV_HIGTH 進去即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章