» »

[Android] pomoč pri postavitvi layouta

[Android] pomoč pri postavitvi layouta

icurk ::

Živjo,

Zanime me kako bi najlažje postavil/zgradil layout, kakor ga prikazuje spodnja slika.
Za ozadje aktivnosti imam sliko čez celotni ekran, na sliki so različni elementi (v primeru na sliki: hiša, klop, ribnik, cvetovi drevesa). Moja želja je, da ko kliknem na posamezen element, se izveda neka akcija. Sam sem mislil čez posamezen element postavit gumb, ki je v celoti prosojen in se ga ne vidi. Zanime pa me, kako naj postavim gumb na pravo mesto, če so te elementi razmetani po sliki in ni nekega reda med njimi?

Slika je zgolj simbolična in ne predstavlja sliko dejanske aplikacije



Hvala, LP

nightrage ::

Uporabiš relativelayout z paddingom.

Mavrik ::

Namesto da si delaš glavobole z layoutom in uničuješ odzivnost ter hitrost delovanja s prosojnimi viewi, se to dela tako, da narediš svoj view.

1.) Extendaš razred View
2.) V onDraw() poskrbiš da se slika nariše na podani Canvas
3.) V onTouchEvent pogledaš koordinate tapa in sprožiš ustrezno akcijo.

To, da greš za statično sliko probat pozicionirat druge viewe nad elemente je neumno, ker boš imel ogromno težav z različnimi zasloni in velikostjo naprav. Pri custom viewu pa samo preračunaš tap glede na razmerje/velikost canvasa.
The truth is rarely pure and never simple.

Zgodovina sprememb…

  • spremenil: Mavrik ()

icurk ::

Trenutno sem uspel nekako narediti tole (uporabil sem framelayout in potem odmike(v dp) na posameznih gumbih).
Sedaj pa sem prišel do drugega problema. Kako narediti te odmike, da bodo na vseh ekranih in različnih resolucijah enaki.

Mavrik ::

icurk je izjavil:

Trenutno sem uspel nekako narediti tole (uporabil sem framelayout in potem odmike(v dp) na posameznih gumbih).
Sedaj pa sem prišel do drugega problema. Kako narediti te odmike, da bodo na vseh ekranih in različnih resolucijah enaki.


Beri moje sporočilo.
The truth is rarely pure and never simple.

icurk ::

Torej misliš da bi naredil custom view in ga prikazal v aktivnosti? Na kaj se pa potem nanašajo koordinate tapa?

Sem šele na začetku z androidom tako da potrebujem kak podatek/nasvet več :)

icurk ::

Mavrik je izjavil:


1.) Extendaš razred View
2.) V onDraw() poskrbiš da se slika nariše na podani Canvas
3.) V onTouchEvent pogledaš koordinate tapa in sprožiš ustrezno akcijo.

Pri custom viewu pa samo preračunaš tap glede na razmerje/velikost canvasa.


A je res potrebno extendat view? Kaj pa če normalno dam sliko za ozadje in potem v aktivnosti preračunavam tape?

Mavrik ::

icurk je izjavil:



A je res potrebno extendat view? Kaj pa če normalno dam sliko za ozadje in potem v aktivnosti preračunavam tape?


Zakaj spet iščeš bolj zakomplicirano rešitev namesto da bi dve metodi implementiral?

Če se prav spomnim sta getX() in getY() v koordinatah viewa (e.g. 0,0 je levi zgornji kot viewa), getRawX() in getRawY() pa dasta absolutne zaslonske koordinate.
The truth is rarely pure and never simple.

icurk ::

Mavrik je izjavil:


Zakaj spet iščeš bolj zakomplicirano rešitev namesto da bi dve metodi implementiral?

Zato ker nisem popolnoma prepričan kako bi to implementiral in zato poskušam z znanjem ki ga trenutno premorem :/

icurk ::

Zdaj sem se lotil tega po tvojem nasvetu. Sem naredil costum view, kjer sem tudi narisal mojo sliko.
public class Background extends View {

	Bitmap bgImage;

	public Background(Context context) {
		super(context);
		bgImage = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
		
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		bgImage = getResizedBitmap(bgImage, canvas.getHeight()-100, canvas.getWidth());
		canvas.drawBitmap(bgImage, 0, canvas.getHeight()/2, null);
		
	}

	public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
		int width = bm.getWidth();
		int height = bm.getHeight();
		
		float scaleWidth = ((float) newWidth) / width;
		float scaleHeight = ((float) newHeight) / height;
		
		// CREATE A MATRIX FOR THE MANIPULATION
		Matrix matrix = new Matrix();
		// RESIZE THE BIT MAP
		matrix.postScale(scaleWidth, scaleHeight);

		// "RECREATE" THE NEW BITMAP
		Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
				matrix, false);
		return resizedBitmap;
	}
}

Ter naredil aktivnost in ontouch event:
public class Main extends Activity {

	Background bg;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		bg = new Background(this);
		setContentView(bg);

		bg.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {

					Toast.makeText(
							getApplicationContext(),
							"Touch coordinates : "
									+ String.valueOf(event.getX()) + ":"
									+ String.valueOf(event.getY()),
							Toast.LENGTH_SHORT).show();
					return true;
				}
				return false;
			}
		});
	}
}


A si mislil da nekako tako naredim?

Zdej se koordinate klika vedno nanašajo na celotni zaslon in ne na sliko, če je slika čez celotni zaslon ni problemov. Če pa je slika recimo da malo zamaknjena (zaradi različnega razmerja stranic) pa to nebo kul.
torej kako dobim koordinate klikov, ki se nanašajo zgolj na sliko?

icurk ::

No tole mi je sedaj uspelo in mi vse dela tako kot mora.
Sedaj me pa zanima, kako/če se da narediti tako, da se s pritiskom na neko področje tam pojavi neka slika/gumb ter s pritiskom nanj, se mi zažene nova aktivnost? Te slike/gumbi so lahko tudi že vnaprej nekako pozicionirani(glede na razmerje strani, lahko izračunam kje so postavljeni), in se nerabijo nanašat na koordinate klika.
Kako bi lahko to naredil?

Mavrik ::

Prvič, ful ti priporočam da getResizedBitmap pokličeš samo enkrat, ne na vsak frame izrisa. Bo namreč tvoj app izjemno štekal.

Za drugo vprašanje - pač postavi jih po zaslonu, z RelativeLayout al neki pa daj visibility na invisible. Kje je točno problem?
The truth is rarely pure and never simple.

icurk ::

1. Kje pa je potem najbolše poklicati getResizedBitmap?

2. To bi že šlo, če nebi morali biti te elementi postavljeni tako natančno. Kar želim narediti je to, da ko kliknem na določeno področje, se mi potem pojavi slika v tem področju na točno določenem mestu(kakor kaže slika spodaj). In ker imajo naprave različne resolucije in razmerje stranic, se potem to rahlo zakomplicira.

Sem si pa zdej vse skupaj zastavil malo drugače. Za moj layout bi uporabil framelayout, v katerega bi dal costumview(kjer narišem ozadje in računam vse potrebno), potem pa bi samo dodajal slike, ki bi jih potem v aktivnosti postavljal s setX in setY. Prej bi pa seveda izračunal kakšna mora biti x in y koordinata. Glede na to, da poznam vse potrebne količine, mislim da mi bi moralo nekako uspeti izračunati...




Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android][Java] Povečanje hitrosti algoritma

Oddelek: Programiranje
81106 (687) Legoless
»

[Android] Splošno

Oddelek: Programiranje
351941 (1071) piki12
»

Programiranje problem android

Oddelek: Programiranje
51093 (858) g333kk
»

Android zamenjava pogledov

Oddelek: Programiranje
6986 (807) c00L3r
»

android črta

Oddelek: Programiranje
412273 (1544) g333kk

Več podobnih tem