2014-06-22 70 views
0

我在製作用於支持多個屏幕的android拼圖的UI時遇到問題! 期望中的謎題是這樣的:用於在多個屏幕上創建拼圖的Android gridview

我用GridView和設置圖像中的每個單元(每個單元都有一個鮮明的形象) 我不知道它是如何設定的GridView的尺寸和氏細胞(行高/列寬)而不使用屏幕分辨率! :( 圖像具有1:1分的縱橫比,並且必須在細胞伸展

我所做:

row_grid.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="300dp" 
     android:layout_height="100dp" 
     android:padding="0dp" > 

     <ImageView 
      android:id="@+id/item_image" 
      android:layout_width="100dp" 
      android:layout_height="100dp" 
      android:scaleType="fitXY" 
      android:src="@drawable/icon2" > 
     </ImageView> 
</FrameLayout> 

activity_main.xml中

<FrameLayout 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" 
    android:background="@drawable/katy"> 

    <GridView 
     android:id="@+id/gridView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:horizontalSpacing="0dp" 
     android:numColumns="2" 
     android:stretchMode="columnWidth" 
     android:verticalSpacing="0dp" > 

    </GridView> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:text="TextView" 
     android:textSize="30sp" /> 

</FrameLayout> 

MainActivity.java

package com.example.test; 

import java.util.ArrayList; 

import android.R.dimen; 
import android.R.integer; 
import android.os.Bundle; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Point; 
import android.view.Display; 
import android.view.Menu; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.GridView; 
import android.widget.TextView; 


public class MainActivity extends Activity { 
    GridView gridView; 
    ArrayList<Item> gridArray = new ArrayList<Item>(); 
    CustomGridViewAdapter customGridAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     //Remove App TitleBar 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final TextView txt = (TextView) findViewById(R.id.textView1); 
     txt.setText(Integer.toString(width)+" x "+Integer.toString(height)); 


     Bitmap block = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon1); 
     Bitmap block2 = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon2); 
     Bitmap block3 = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon3); 
     Bitmap block4 = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon4); 

     gridArray.add(new Item(block)); 
     gridArray.add(new Item(block2)); 
     gridArray.add(new Item(block3)); 
     gridArray.add(new Item(block4)); 

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

     ViewGroup.LayoutParams layoutParams = gridView.getLayoutParams(); 
     layoutParams.height = 300; //this is in pixels 
     layoutParams.width = 300; //this is in pixels 
     gridView.setLayoutParams(layoutParams); 


     customGridAdapter = new CustomGridViewAdapter(this, R.layout.row_grid, gridArray); 
     gridView.setAdapter(customGridAdapter); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

結果:

result

我怎樣才能使獨立的屏幕尺寸和分辨率的? :(

編輯: 我試圖動態改變的GridView的寬度,但致命的異常出現

package com.example.test; 

import java.util.ArrayList; 

import android.R.dimen; 
import android.R.integer; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Point; 
import android.view.Display; 
import android.view.Menu; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.GridView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 


public class MainActivity extends Activity { 
    GridView gridView; 
    ArrayList<Item> gridArray = new ArrayList<Item>(); 
    CustomGridViewAdapter customGridAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     //Remove App TitleBar 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     //Get Screen Dimensions 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     int width = size.x; 
     int height = size.y; 

     final TextView txt = (TextView) findViewById(R.id.textView1); 
     txt.setText(Integer.toString(width)+" x "+Integer.toString(height)); 

     Bitmap block = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon1); 
     Bitmap block2 = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon2); 
     Bitmap block3 = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon3); 
     Bitmap block4 = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon4); 

     gridArray.add(new Item(block)); 
     gridArray.add(new Item(block2)); 
     gridArray.add(new Item(block3)); 
     gridArray.add(new Item(block4)); 

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

     //###### Change Height of cells #####// 
     LinearLayout rg = (LinearLayout) findViewById(R.layout.row_grid); 
     ViewGroup.LayoutParams rgparam = rg.getLayoutParams(); 
     rgparam.height = rgparam.width; 
     rg.setLayoutParams(rgparam);   

     customGridAdapter = new CustomGridViewAdapter(this, R.layout.row_grid, gridArray); 
     gridView.setAdapter(customGridAdapter); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

我也測試了這一點:!

customGridAdapter = new CustomGridViewAdapter(this, rg.getId(), gridArray); 

回答

1

看一看相對佈局我相信它可以解決你的問題,你可以指定圖像的位置和相鄰的位置,所以在上面的圖像中,方框2將位於方框1的右邊並與父視圖的頂部對齊。對齊到父母的頂部和左側

+0

如何根據屏幕分辨率定義單元格的寬度和高度?網格的行數和列數已修復(9x6) – Jessica

+0

我會查看畫布/屏幕的高度和寬度並進行適當的分割。然後,我將使用Path類根據這些尺寸創建框形狀。我會用與圖像相同的背景顏色填充這些框,並將圖像置於每個框內(不確定如何操作,但在搜索其他問題時看到有關它的問題)。你會創建你自己的觀點,這是與我原來的答案不同的方法。 – Steven

+0

我嘗試根據屏幕大小動態調整「row_grid」佈局的大小,但發生運行時錯誤並終止了應用程序! – Jessica

1
Try with below code and check if its working or not? 



     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="100dp" 
       android:layout_height="100dp" 
       android:padding="0dp" > 

       <ImageView 
        android:id="@+id/item_image" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:scaleType="fitXY" 
        android:src="@drawable/ic_launcher" > 
       </ImageView> 

      </LinearLayout> 

    ------------------------------- 

    <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" 
     android:background="@drawable/background" > 

     <GridView 
      android:id="@+id/gridView1" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:horizontalSpacing="0dp" 
      android:numColumns="3" 
      android:stretchMode="columnWidth" 
      android:verticalSpacing="0dp" > 
     </GridView> 

    </RelativeLayout> 
+0

謝謝。我之前嘗試過。一切都很好,但行高不正確! Gridview中的行高必須等於單元格寬度,但我認爲它等於原始圖像高度(300px)!這是結果:http://s1.uploads.im/GhseS.png – Jessica

+0

@Jessica燁,我已經看到了,只是檢查我編輯的答案,並檢查,如果這將工作,那麼它的GTR,如果不工作,讓我知道。我會給你另一個代碼。 –

+0

謝謝。不幸的是它不起作用!看看這個:http://i.imgur.com/nQ87UZa.png;裁剪圖像的右側!另外我不想使用絕對寬度和高度(100dp)。我試圖設置row_grid.height等於row_grid.width但發生運行時錯誤! – Jessica