【问题标题】:GridView fit on screen in MDPI but not fit in HDPI and XHDPIGridView 在 MDPI 中适合屏幕,但不适合 HDPI 和 XHDPI
【发布时间】:2013-03-05 15:53:04
【问题描述】:

网格视图图像不适合 hdpi 和 xhdpi。它非常适合 mdpi 模拟器和设备。我的图像尺寸如下(它遵循 3:4:6:8 的比例)。

ldpi 366*225 mdpi 488*300 //它适合模拟器和设备屏幕 高清画质 732*450 xhdpi 976*600

第一个图像(MDPI)正确适合屏幕,第二个图像(XHDPI 与 HDPI 相同)不适合?

菜单活动:

GridView gridView = (GridView) findViewById(R.id.gridview);

    gridView.setAdapter(new ImageAdapter(this));


    gridView.setOnTouchListener(new OnTouchListener(){
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_MOVE){
                return true;
            }
            return false;
        }
    });

    gridView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
    gridView.setVerticalScrollBarEnabled(false);

ImageAdapter.java:

public class ImageAdapter extends BaseAdapter {

    private Context mcontext;

    public ImageAdapter(Context c) {
        mcontext=c;
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        ImageView imageView ;

        if(convertView==null)
        {
            imageView = new ImageView(mcontext);
            //imageView.inflate(mcontext, R.layout.mainmenu_griditem,null);
            ImageView.inflate(mcontext, R.layout.mainmenu_griditem,null);

            WindowManager wm = (WindowManager) mcontext.getSystemService(Context.WINDOW_SERVICE);

            Display display = wm.getDefaultDisplay();
            DisplayMetrics outMetrics = new DisplayMetrics ();
            display.getMetrics(outMetrics);

            float density  = mcontext.getResources().getDisplayMetrics().density;

            Log.i("image","density->"+density);
            float dpHeight = outMetrics.heightPixels / density;
            Log.i("image","dpHeight->"+dpHeight);
            float dpWidth  = outMetrics.widthPixels / density;
            Log.i("image","dpWidth->"+dpWidth);

            int width=(int) (dpWidth/2);
            int height=(int) (dpHeight/2.3);

            Log.i("image","Image Width->"+width);
            Log.i("image","Image height->"+height);

            //int width=(int) (dpWidth);
            //int height=(int) (dpHeight);

            //imageView.setLayoutParams(new GridView.LayoutParams(width,height));


            imageView.setLayoutParams(new GridView.LayoutParams(width,height));





            //imageView.setLayoutParams(new GridView.LayoutParams(parent.getWidth()/2,parent.getHeight()/2));


            //imageView.setLayoutParams(new GridView.LayoutParams(imageView.getWidth(),imageView.getHeight()));

            //imageView.setBackgroundColor(000000);
            //imageView.setLayoutParams(new GridView.LayoutParams(400,200));
            //imageView.setLayoutParams(new GridView.LayoutParams());
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            //imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            //imageView.setPadding(40,40,40,40);
        }
        else
        {
            imageView=(ImageView)convertView;
        }


        imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }


    // references to our images
    private Integer[] mThumbIds = {
            R.drawable.mainmenu1, R.drawable.mainmenu2,
            R.drawable.mainmenu3, R.drawable.mainmenu4
    };
}

我尝试了很多,但没有任何帮助。

ma​​inmenugriditem.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView android:id="@+id/mm_grid_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

       />
    <TextView android:id="@+id/mm_grid_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:labelFor="@id/mm_grid_image"/>

</RelativeLayout>

MDPI 的 Logcat 输出:(Emulator-7" WSVGA-tablet-1024*600:mdpi)

XHDPI 的 Logcat 输出:(Emulator-Galaxy Nexus-4.65"-720*1280:xhdpi)

【问题讨论】:

  • 您能否发布您在注销 mdpi 和 xhdpi 的宽度和高度时得到的结果?我想仔细检查 xhdpi 值是否是双倍 mdpi。
  • 用 mdpi 和 xhdpi 的 logcat 输出以及我的 mainmenugriditem.xml 文件更新了我的问题。
  • 我也有疑问,根据四种分辨率(ldpi.mdpi,hdpi,xhdpi)或屏幕尺寸设计图片?

标签: android android-layout android-gridview


【解决方案1】:

您好,如果不是这样创建,您是否为不同的屏幕尺寸创建了单独的文件夹

小布局

大布局

布局-xlarge

然后,您将布局 XML 文件复制到这些文件夹中,并在 Palette 窗口中检查 Xhdpi 的预览,默认屏幕大小为 10",以便您可以在布局中调整网格视图。

【讨论】:

    【解决方案2】:

    我为 MDPI 分辨率设计了位图(因为 1 px=1 dp 在 MDPI 中)。然后使用http://labs.skinkers.com/content/android_dp_px_calculator/转换为其他分辨率桶

    修改以下代码:

    改变这个:

                    Log.i("image","density->"+density);
                    float dpHeight = outMetrics.heightPixels / density;
                    Log.i("image","dpHeight->"+dpHeight);
                    float dpWidth  = outMetrics.widthPixels / density;
                    Log.i("image","dpWidth->"+dpWidth);
    

    收件人:

                float dpHeight = outMetrics.heightPixels;
                float dpWidth  = outMetrics.widthPixels;
    

    【讨论】:

    猜你喜欢
    • 2016-05-25
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多