0

如果视图宽度固定,我想计算一次在屏幕上显示多少视图。为此,我得到一个布局,在其中添加一些固定大小的视图并运行它。

但是根据我的计算,我在屏幕上显示的孩子数量错误,因为它显示在屏幕上。

请告诉我我错在哪里?

这是我的代码...

   In Activity ...
    ----
     LinearLayout featured_listlayout_horizontallayout=(LinearLayout)findViewById(R.id.featured_listlayout_horizontallayout);
            LayoutInflater inflater=LayoutInflater.from(getApplicationContext());
            for(int i=0;i<20;i++){
                LinearLayout childItem=(LinearLayout)inflater.inflate(R.layout.childitemlayout,null);
                Button btn=(Button)childItem.findViewById(R.id.btn);
                btn.setText("Item"+(i+1));
                featured_listlayout_horizontallayout.addView(childItem);
            }

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);

    final int height = dm.heightPixels;
    float screenWidth = dm.widthPixels;//Screen Width in pixel

    float itemWidth=getResources().getDimension(R.dimen.featured_text);//itemWidth in DP
    itemWidth=convertDpToPixel(itemWidth, getApplicationContext());// convert itemWidth into pixel

    System.out.println("screenWidth "+screenWidth+" itemWidth "+itemWidth);

    float noOfItem=screenWidth/itemWidth;
    System.out.println("noOfItem "+noOfItem);

    -----

    convertPixelsToDp method:


    public float convertPixelsToDp(float px,Context context){
            Resources resources = context.getResources();
            DisplayMetrics metrics = resources.getDisplayMetrics();
            float dp = px / (metrics.densityDpi / 160f);
            return dp;
        }  

  convertDpToPixel method:

   public float convertDpToPixel(float dp,Context context){
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float px = dp * (metrics.densityDpi/160f);
        return px;
    }

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >

        <HorizontalScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <LinearLayout
                android:id="@+id/featured_listlayout_horizontallayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingBottom="5dp" >
            </LinearLayout>
        </HorizontalScrollView>

    </RelativeLayout>


    childitemlayout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="@dimen/featured_text"
        android:layout_height="@dimen/featured_image"
        android:orientation="vertical" 
        android:background="#0000ff">

        <Button android:id="@+id/btn"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="Button"
                android:background="#ff00ff"/>


    </LinearLayout>



    dimen.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
             <dimen name="featured_text">80dp</dimen>
             <dimen name="featured_image">60dp</dimen>
    </resources>
4

1 回答 1

1

但是根据我的计算,我在屏幕上显示的孩子数量错误,因为它显示在屏幕上。

以像素为单位获得屏幕宽度

float screenWidth = dm.widthPixels;

对于项目的宽度,您可以获得以像素为单位的宽度,但您也可以将其转换为dp

float itemWidth=getResources().getDimension(R.dimen.featured_text);
itemWidth=convertPixelsToDp(itemWidth, getApplicationContext());

然后您尝试将这两个值一起使用。

使用pixelsdp

编辑2:

你真的应该阅读类的inflate()方法LayoutInflater。您需要使用正确的视图来膨胀视图,LayoutParams这是通过提供ViewGroup将是膨胀布局文件的父级来完成的。所以你需要这样做:

LinearLayout childItem = (LinearLayout) inflater.inflate(
                    R.layout.aaaaaaaaaaaa, featured_listlayout_horizontallayout, false);

如果你不这样做,你的膨胀视图将没有设置的大小(你可能已经看到它们会包装它们的内容)。完成上述修改后,您想在实际将它们添加到布局中(使用您在 xml 布局中设置的尺寸)之前找出可见(完全或部分)的子项的数量,您只需划分屏幕宽度到资源的尺寸:

int screenWidth = dm.widthPixels;
int itemWidth=getResources().getDimension(R.dimen.featured_text);
int noOfItem=screenWidth/itemWidth;
// if we have a remainder from the division it means there is extra space
// so we need to check if we have more items so there is another child partially showing
int rem = screenWidth % itemWidth;
if (rem != 0) {
    noOfItem += 1;
}

编辑1:

您当前的代码将不起作用,并且您不理解我的答案。dm.widthPixels返回以像素为单位的屏幕宽度(您HorizontalScrollView填充的)。getResources().getDimension(R.dimen.featured_text)将以像素为单位返回该维度资源的值。不需要方法来转换这些值,只需直接使用它们即可。即便如此,您的代码也不会按您的意愿正常工作,因为您没有注意LayoutParams为您的视图分配适当的权限。您应该像这样膨胀子布局:

LinearLayout childItem = (LinearLayout) inflater.inflate(
                    R.layout.aaaaaaaaaaaa, featured_listlayout_horizontallayout, false);

另外,我将只使用下面的代码(在onCreate方法中使用)来找出屏幕上可见的子项(完全可见或部分可见):

featured_listlayout_horizontallayout.post(new Runnable() {

        @Override
        public void run() {
            DisplayMetrics dm = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);
            // screen width
            final float screenWidth = dm.widthPixels;
            final int count = featured_listlayout_horizontallayout
                    .getChildCount();
            int realWidth = 0;
            int visibleChildren = 0;
            for (int i = 0; i < count; i++) {
                final View child = featured_listlayout_horizontallayout
                        .getChildAt(i);
                realWidth += child.getWidth();
                if (realWidth < screenWidth) {
                    visibleChildren++;
                } else {
                    visibleChildren++;
                    break;
                }
            }
            // visibleChildren now has the visible children on the screen
        }

    });
于 2013-01-11T14:29:27.673 回答