在我的应用程序中,我有一个滚动视图。在我的应用程序的生命周期中,我动态地向滚动视图添加新视图。我可以添加几乎没有问题的视图,但我不能正确的维度。这是我想要的布局的草图:
在图片中,我的屏幕尺寸为var lex = require('pug-lexer');
var filename = 'template.pug';
var src = `
html
head
title= myTitle
body
h1 #{value.headline}
p #{paragraph.text}`;
var tokens = lex(src, {filename});
Width
。它包含Height
(或者可能是HorizontalScrollView
,但我不知道如何使用这个),当视图添加到它时会增长。我希望添加到视图中的每个项目的宽度等于屏幕高度的五分之一并具有匹配的高度。如果我对膨胀视图的宽度进行硬编码,我可以做到这一点,但是,我的视图在所有手机上的宽高比都不一样。
注意:我尝试过使用PercentRelativeLayout,但我无法让它工作。不知道如何解决这个问题...任何想法?
关于赏金的说明:我会接受Java或C#(Xamarin)的答案!!我的项目是在Xamarin,所以如果它适用于它,或者如果它可以很容易地适应在C#中工作那将是很好的
答案 0 :(得分:4)
您不希望视图占屏幕高度的五分之一,您希望它是父视图高度的五分之一。或者完全准确地说,你希望你的宽度是视图高度的五分之一。
不同之处在于,使用屏幕宽度/高度可能会在您的设备上运行,但会破坏其他设备。如果有人用分屏打开您的应用,您会怎么做?
然而,视图维度的定义,方法是相同的:如果您想要遵循某些规则的视图,则必须创建自己的视图并相应地测量视图。
if (head == NULL)
{
head = temp;
}
else
{
temp1 = head;
while (temp1->link != NULL)
{
temp1 = temp1->link;
}
temp1->link = temp;
}
基本上就是这样。您可能希望阅读有关@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int availableHeight = MeasureSpec.getSize(heightMeasureSpec);
int wantedWidth = availableHeight / 5;
setMeasuredDimension(wantedWidth, availableHeight);
}
的正确文档并一般地测量视图。我还撰写了一篇关于custom views的博客文章,内容涵盖了一些基础知识。
然后,您可以将自定义视图添加到支持ScrollView的LinearLayout,然后进行设置。
以下是基本工作的完整示例,您可能希望使用与框架布局不同的内容。
MeasureSpec
答案 1 :(得分:2)
我们假设您可以使用ViewPager。如果是这样,您将需要覆盖getPageWidth()方法。此方法告诉viewpager它内部的每个视图必须有多宽,从0(无)到1(使用全部)。
如果可能,我们将计算动态尺寸,请记住我们只想使用屏幕的三分之一。假设您想要将整个屏幕用于仅包含一个元素的集合,一半用于具有两个元素的集合的屏幕,以及用于其他每个元素的动态计算。
@Override
public float getPageWidth(int position) {
try{
Paint paint = new Paint();
return 0.3f+paint.measureText(data.get(position).getSize())/ DeviceFunctions.giveScreenResolution((Activity) context).x;
}
catch(Exception e){
int size = data.getValues().size();
switch(size){
case 1: return 1.f;
case 2: return 0.5f;
case 3: return 0.33f;
default: return 0.33f;
}
}
}
我们假设:
- 数据收集允许您检测视图的预期宽度。您可以使用任何所需的参考进行更改。或者您可以根据视图的位置给出固定大小:
@Override
public float getPageWidth(int position) {
int size = data.getValues().size();
switch(size){
case 1: return 0.35f;
case 2: return 0.35f;
case 3: return 0.30f;
default: return 0.33f;
}
}
获取屏幕分辨率:
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
public static Point giveScreenResolution(Activity activity){
Display display = activity.getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
return size;
}
答案 2 :(得分:1)
在我的一个应用程序中使用此代码并且工作得很好。
public static int getScreenHeight(Activity context)
{
Display display = context.getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int height = size.y;
return height;
}
在我的活动中,我正在使用以下代码
//Container layout may be child of HorizontalScrollView
LinearLayout parent = (LinearLayout)findViewById(R.id.splash_screen_logo);
//Child layout to be added
View mychildview = getLayoutInflater().inflate((R.layout.childView);
mychildview.getLayoutParams().width = Utils.getScreenHeight(this)/5;
mychildview.getLayoutParams().height = Utils.getScreenHeight(this);
parent.addview(mychildview)