我需要缩放我的TabWidget背景图像,以便保持宽高比 我正在使用带有TabWidget的TabHost。然后我使用setBackgroundDrawable来设置图像。
我在这里找到了一个接近的答案 - Background in tab widget ignore scaling。但是,我不确定在哪里添加新的Drawable代码。 (使用HelloTabWidget示例,我的模块都没有使用RelativeLayout,我没有看到“tabcontent”的任何布局。)
我也找到了这个帖子 - Android: Scale a Drawable or background image?。根据它,听起来我必须预先缩放我的图像,这使得它们的目标无法扩展。
我还发现了另一个线程,其中有人将Drawable类子类化,因此它不会缩放,也不会正确缩放。我现在找不到它,但是当你应该能够做一些像mTab.setScaleType(centerInside)这样简单的事情时,这似乎很难实现。
这是我的代码:
main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/main_background">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"/>
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"/>
</LinearLayout>
</TabHost>
主要活动:
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
TabHost changedTabHost = getTabHost();
TabWidget changedTabWidget = getTabWidget();
View changedView = changedTabHost.getTabWidget().getChildAt(0);
public void onTabChanged(String tabId) {
int selectedTab = changedTabHost.getCurrentTab();
TabWidget tw = getTabWidget();
if(selectedTab == 0) {
//setTitle("Missions Timeline");
View tempView = tabHost.getTabWidget().getChildAt(0);
tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_timeline_on));
tempView = tabHost.getTabWidget().getChildAt(1);
tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_map_off));
tempView = tabHost.getTabWidget().getChildAt(2);
tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_search_off));
tempView = tabHost.getTabWidget().getChildAt(3);
tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_news_off));
tempView = tabHost.getTabWidget().getChildAt(4);
tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_license_off));
//ImageView iv = (ImageView)tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
//iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_timeline_on));
//iv = (ImageView)tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
//iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_off));
} else if (selectedTab == 1) {
//setTitle("Spinoffs Around You");
View tempView = tabHost.getTabWidget().getChildAt(0);
tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_timeline_off));
tempView = tabHost.getTabWidget().getChildAt(1);
tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_map_on));
tempView = tabHost.getTabWidget().getChildAt(2);
tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_search_off));
tempView = tabHost.getTabWidget().getChildAt(3);
tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_news_off));
tempView = tabHost.getTabWidget().getChildAt(4);
tempView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_license_off));
}
我也尝试了9patch图像,但它们太小了。
那么,最好的方法是什么呢?
答案 0 :(得分:1)
检查一下,让我知道它是否适合你。
答案 1 :(得分:0)
我怀疑你正在努力寻找一种开箱即用的方式来执行背景图像缩放的原因是它通常不被视为良好的做法。缩放图像往往会引入伪像和条带,这会使您的UI看起来很讨厌。这个例外是在Imageview中,但我认为这个类提供的缩放支持更倾向于支持照片或Web内容(即您的应用程序未附带的图像)。
您的UI布局应该以这样的方式设计,即任何基于资源的背景图像都应该预先缩放到设备密度/屏幕尺寸的正确分辨率。换句话说,您应该使用Supporting Multiple Screens开发指南中概述的资源文件夹命名约定,为每个drawable提供多个版本,以满足多种屏幕密度和大小。
然后应该布置UI,使得可以处理设备之间的屏幕尺寸的任何微小差异,而无需缩放其包含的视图的背景图像。显然我不知道您提出的UI是什么样的,因此很难提出任何具体建议,但通常我使用简单的背景块颜色或ShapeDrawable
来动态填充视图之间的空间。
但是,如果您真的确定要扩展背景图像,尽管上面讲道:-),为什么不尝试使用ScaleDrawable
来包装现有的drawable?
如果您知道您的视图和背景图片的高度和宽度是否可绘制,那么您可以执行以下操作:
Drawable backgroundDrawable = getResources().getDrawable(R.drawable.tab_license_off);
tempView.setBackgroundDrawable(
new ScaleDrawable(
backgroundDrawable,
Gravity.CENTER,
tempView.getWidth() / backgroundDrawable.getIntrinsicWidth(),
tempView.getHeight() / backgroundDrawable.getIntrinsicHeight());