#android #gridview #imageview #screen #puzzle
#Android #gridview #просмотр изображений #экран #Головоломка
Вопрос:
У меня проблема с созданием пользовательского интерфейса для головоломки на Android, который поддерживает несколько экранов! Желаемая головоломка выглядит примерно так:
Я использовал 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;
}
}
Результат:
Как я могу сделать это независимым от размера и разрешения экрана ?! : (
Редактировать: я попытался динамически изменить ширину 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 и выровнено по верхней части родительского представления. Поле 1 будет выровнено по верху и слева от родительского элемента.
Комментарии:
1. Как я могу определить ширину и высоту ячеек в соответствии с разрешением экрана? Исправлено количество строк и колонок сетки (9×6)
2. Я бы посмотрел на высоту и ширину холста / экрана и разделил соответствующим образом. Затем я бы использовал класс Path для создания прямоугольных фигур на основе этих размеров. Я бы заполнил эти поля тем же цветом фона, что и изображение, и расположил изображение по центру внутри каждого поля (не уверен, как это сделать, но я видел вопросы, задаваемые по этому поводу при поиске других вопросов). Вы бы создали свой собственный вид, который отличается от моего первоначального ответа.
3. Я попытался динамически изменять размер макета «row_grid» в соответствии с размером экрана, но произошла ошибка во время выполнения, и приложение завершило работу!!!
Ответ №2:
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>
Комментарии:
1. Большое вам спасибо. Я пробовал это раньше. все хорошо, но высота строки неправильная! Высота строки в Gridview должна быть равна ширине ячейки, но я думаю, что она равна высоте исходного изображения (300 пикселей)!!! Это результат: s1.uploads.im/GhseS.png
2. @Jessica да, я это видел, просто проверьте мой отредактированный ответ и проверьте, сработает ли это, если это не сработает, дайте мне знать. Я дам вам другой код.
3. Спасибо. К сожалению, это не работает! Посмотрите на это: i.imgur.com/nQ87UZa.png ; правая сторона изображений обрезана!!! Кроме того, я не хочу использовать абсолютную ширину и высоту (100dp). Я попытался установить row_grid.height равным row_grid.width, но произошла ошибка во время выполнения!
4. @jessica Я думаю, вам нужно использовать динамическую ширину и высоту, не могли бы вы прислать мне свой код, позвольте мне сделать это за вас и отправить его вам обратно.
5. @Jessica привет, можешь прислать мне свой cdoe, дай мне проверить в моем редакторе.