Android 搜索栏在 FrameLayout 中旋转 off/clipped
Android seekbars cut off/clipped on rotation in FrameLayout
所以我想制作一个穷人的交互式雷达图或蜘蛛图,但我找不到。我确实找到了这个:
Android Layout views rotated and spaced around a circle?
并想到在其中旋转搜索栏并且它有点工作,但搜索栏本身通过某个边界得到 clipped/cut-off 我不知道它是什么。我用填充尝试了一些东西,但它们没有帮助。
MainActivity 代码如下所示:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Context context = getApplicationContext();
final FrameLayout main = (FrameLayout)findViewById(R.id.main);
int numViews = 6;
for(int i = 0; i < numViews; i++)
{
// Create some quick TextViews that can be placed.
TextView v = new TextView(this);
SeekBar sb = new SeekBar(this);
// Set a text and center it in each view.
v.setText("View " + i);
v.setGravity(Gravity.CENTER);
v.setBackgroundColor(0xff00ffff);
// Force the views to a nice size (150x100 px) that fits my display.
// This should of course be done in a display size independent way.
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(400, 75);
FrameLayout.LayoutParams lpv = new FrameLayout.LayoutParams(300, 75);
// Place all views in the center of the layout. We'll transform them
// away from there in the code below.
lp.gravity = Gravity.CENTER;
lpv.gravity = Gravity.CENTER;
lp.bottomMargin = 150;
lpv.bottomMargin = 150;
// Set layout params on view.
v.setLayoutParams(lpv);
sb.setLayoutParams(lp);
// Calculate the angle of the current view. Adjust by 90 degrees to
// get View 0 at the top. We need the angle in degrees and radians.
float angleDeg = i * 360.0f / numViews - 90.0f;
float angleRad = (float)(angleDeg * Math.PI / 180.0f);
// Calculate the position of the view, offset from center (300 px from
// center). Again, this should be done in a display size independent way.
v.setTranslationX(500 * (float)Math.cos(angleRad));
v.setTranslationY(500 * (float)Math.sin(angleRad));
sb.setTranslationX(250 * (float)Math.cos(angleRad));
sb.setTranslationY(250 * (float)Math.sin(angleRad));
// Set the rotation of the view.
v.setRotation(angleDeg +90f);
sb.setRotation(angleDeg );
main.addView(sb);
main.addView(v);
}
}
和activity_main.xml代码是:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Settings"
android:layout_marginBottom="150px"/>
</FrameLayout>
任何水平(如果有 8 个)或垂直的搜索栏看起来都不错,但对角线的搜索栏显示不正确。结果是这样的:
所以视图 1 和 2 几乎没有显示栏,尽管拇指都正确移动。视图 4 和 5 根本不显示它。我应该更改什么以使它们完全可见?非常感谢!
编辑:添加 numViews= 8 和 15 的屏幕截图
奇怪的是右边只有一些对角线可见,左边什么都没有。是否也需要旋转某种填充 "box"?
我 运行 你的代码在 2 个模拟器上看起来不错 -
您 运行 使用的 Android 版本是什么?
android 设备不同屏幕分辨率和密度的问题。所以请阅读这个
"Supporting Multiple Screens" 阅读本站:
https://developer.android.com/guide/practices/screens_support.html
您还需要在 manifast xml 文件中支持不同的屏幕 打开 "AndroidManifest" 并在 android versionName 之后添加以下内容。
<supports-screens android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"
android:resizeable="true"/>
我最近 运行 也遇到了这个问题。但是我在 Android Studio 中使用布局编辑器构建我的 UI,并且想知道为什么旋转的搜索栏在预览中看起来很好。所以我尝试添加一个软件 layerType
,这似乎有效!
android:layerType="software"
或者您的情况:
sb.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
希望这对您有所帮助。
Screenshot
所以我想制作一个穷人的交互式雷达图或蜘蛛图,但我找不到。我确实找到了这个: Android Layout views rotated and spaced around a circle? 并想到在其中旋转搜索栏并且它有点工作,但搜索栏本身通过某个边界得到 clipped/cut-off 我不知道它是什么。我用填充尝试了一些东西,但它们没有帮助。
MainActivity 代码如下所示:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Context context = getApplicationContext();
final FrameLayout main = (FrameLayout)findViewById(R.id.main);
int numViews = 6;
for(int i = 0; i < numViews; i++)
{
// Create some quick TextViews that can be placed.
TextView v = new TextView(this);
SeekBar sb = new SeekBar(this);
// Set a text and center it in each view.
v.setText("View " + i);
v.setGravity(Gravity.CENTER);
v.setBackgroundColor(0xff00ffff);
// Force the views to a nice size (150x100 px) that fits my display.
// This should of course be done in a display size independent way.
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(400, 75);
FrameLayout.LayoutParams lpv = new FrameLayout.LayoutParams(300, 75);
// Place all views in the center of the layout. We'll transform them
// away from there in the code below.
lp.gravity = Gravity.CENTER;
lpv.gravity = Gravity.CENTER;
lp.bottomMargin = 150;
lpv.bottomMargin = 150;
// Set layout params on view.
v.setLayoutParams(lpv);
sb.setLayoutParams(lp);
// Calculate the angle of the current view. Adjust by 90 degrees to
// get View 0 at the top. We need the angle in degrees and radians.
float angleDeg = i * 360.0f / numViews - 90.0f;
float angleRad = (float)(angleDeg * Math.PI / 180.0f);
// Calculate the position of the view, offset from center (300 px from
// center). Again, this should be done in a display size independent way.
v.setTranslationX(500 * (float)Math.cos(angleRad));
v.setTranslationY(500 * (float)Math.sin(angleRad));
sb.setTranslationX(250 * (float)Math.cos(angleRad));
sb.setTranslationY(250 * (float)Math.sin(angleRad));
// Set the rotation of the view.
v.setRotation(angleDeg +90f);
sb.setRotation(angleDeg );
main.addView(sb);
main.addView(v);
}
}
和activity_main.xml代码是:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Settings"
android:layout_marginBottom="150px"/>
</FrameLayout>
任何水平(如果有 8 个)或垂直的搜索栏看起来都不错,但对角线的搜索栏显示不正确。结果是这样的:
所以视图 1 和 2 几乎没有显示栏,尽管拇指都正确移动。视图 4 和 5 根本不显示它。我应该更改什么以使它们完全可见?非常感谢!
编辑:添加 numViews= 8 和 15 的屏幕截图
奇怪的是右边只有一些对角线可见,左边什么都没有。是否也需要旋转某种填充 "box"?
我 运行 你的代码在 2 个模拟器上看起来不错 -
您 运行 使用的 Android 版本是什么?
android 设备不同屏幕分辨率和密度的问题。所以请阅读这个 "Supporting Multiple Screens" 阅读本站: https://developer.android.com/guide/practices/screens_support.html
您还需要在 manifast xml 文件中支持不同的屏幕 打开 "AndroidManifest" 并在 android versionName 之后添加以下内容。
<supports-screens android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"
android:resizeable="true"/>
我最近 运行 也遇到了这个问题。但是我在 Android Studio 中使用布局编辑器构建我的 UI,并且想知道为什么旋转的搜索栏在预览中看起来很好。所以我尝试添加一个软件 layerType
,这似乎有效!
android:layerType="software"
或者您的情况:
sb.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
希望这对您有所帮助。
Screenshot