• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    LWEEKAndroid development
    Diskuse o vývoji aplikací pro platformu Android.
    -----------------
    Tipy, Triky, Postřehy, Začátečnický help, Nápady na nové aplikace.

    Oficiální developerská stránka: http://developer.android.com
    Něco málo v češtině na WiKi android fora: http://wiki.androidforum.cz/index.php/Programov%C3%A1n%C3%AD
    Článek na Zrojáku: http://zdrojak.root.cz/clanky/vyvoj-pro-android-ii/

    Docela zajímavé tutoriály přímo od vývojářů ze Sony Ericsson:

    na tvorbu vlastního View adapteru
    http://blogs.sonyericsson.com/developerworld/2010/05/20/android-tutorial-making-your-own-3d-list-part-1/

    zajímavý nápad na zoomování jedním prstem - aneb vytváření gest
    http://blogs.sonyericsson.com/developerworld/2010/05/18/android-one-finger-zoom-tutorial-part-1/
    rozbalit záhlaví
    DATEL
    DATEL --- ---
    DATEL: DRIZDIK: Tak nakonec jsem použil řešení ze stack overflow, rozšířená třída Button s upravenou metodou onDraw(). Jen jsem tam opravil výpočet levé pozice ikonky:

        // ------------------------------------------------------------------------------------------
        // http://stackoverflow.com/a/15580164/2459448
    
        private Drawable mLeftDrawable;
        
        @Override
        //Overriden to work only with a left drawable.
        public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom) {
            if (left == null) {
                return;
            }
            left.setBounds(0, 0, (int) (left.getIntrinsicWidth()), (int) (left.getIntrinsicHeight()));
            mLeftDrawable = left;
        }
        
        @Override
        protected void onDraw(Canvas canvas) {
            //transform the canvas so we can draw both image and text at center.
            canvas.save();
            canvas.translate(2 + (mLeftDrawable.getIntrinsicWidth()) / 2, 0);
            super.onDraw(canvas);
            canvas.restore();
            canvas.save();
            int widthOfText = (int) getPaint().measureText(getText().toString());
            //int left = (int) ((getWidth() + widthOfText) / 2 - (mLeftDrawable.getIntrinsicWidth()) - 2);
            int left = (int) ((getWidth() / 2) - (mLeftDrawable.getIntrinsicWidth() + widthOfText + 4) / 2);
            canvas.translate(left, (getHeight() - (mLeftDrawable.getIntrinsicHeight())) / 2);
            mLeftDrawable.draw(canvas);
            canvas.restore();
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            int height = getMeasuredHeight();
            height = Math.max(height, (int) ((mLeftDrawable.getIntrinsicHeight()) + getPaddingTop() + getPaddingBottom()));
            setMeasuredDimension(getMeasuredWidth(), height);
        }
    
    DRIZDIK
    DRIZDIK --- ---
    DATEL: často bude asi udělat ompozici z nějakejch view jednodušší než ohýbat jedno. Já s obrázkama taky zápasím a nemám to rád. :-/
    DATEL
    DATEL --- ---
    Teda ty tlačítka a obecně práce s obrázky v něčem je šílenost. Sice mi ta ikonka zachovává originální rozměry, ale je zarovnaná k okraji. Bohužel, aplikace je i pro API 8, takže zarovnání pomocí "start" (nevím teď, jak je to přesně, prostě by měl zarovnat na začátek textu tlačítka) nemůžu použít. Takže teď už opravdu asi jediná možnost jít tou cestou layoutu i image view a textview místo tlačítka - není to ale moc velká šílenost? Na druhou stranu, na Stack Overflow je toto řešení zmiňováno dost často.
    DATEL
    DATEL --- ---
    Tak nakonec jsem to vyřešil trochu jinak. Vytvořil jsem si teda rozšiřující třídu pro Button, ikdyž by to šlo použít přímo ve fragmentu či kdekoliv, kde je dostupný objekt s tlačítkem, ale při více tlačítkách bych zbytečně opakoval kód, takže ta nová třída je jednodušší a použitelnější. Ve všech třech constructorech pak volám tuto metodu:

        private void setIcon() {
            float density = getResources().getDisplayMetrics().density;
            
            Drawable drawables[] = this.getCompoundDrawables();
            for (Drawable drawable : drawables ) {
                if (drawable != null) {
                    drawable.setBounds(0, 0, (int) (drawable.getIntrinsicWidth() / density), (int) (drawable.getIntrinsicHeight() / density));
                }
            }
            this.setCompoundDrawables(drawables[0], drawables[1], drawables[2], drawables[3]);
        }
    
    DATEL
    DATEL --- ---
    DRIZDIK: díky za tip, ale nějak se mi nepodařilo dostat k tomu scaleType obrázku. V té rozšiřující třídě jsem si načetl drawable objekty:

    Drawable drawables[] = this.getCompoundDrawables();

    Jenže ten drawable objekt mi pak žádnou scaleType property ani set metodu nenabízí... Mohl bys mě prosím nasměrovat správným směrem? Díky.
    ZACK
    ZACK --- ---
    GORG: scene2d totalne ignoruju a to, co chces, delam pres BitmapFont.drawWrapped http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g2d/BitmapFont.html

    Jinak zakladni povidani k bitmap fontu je tady: https://code.google.com/p/libgdx-users/wiki/addingText2D ... je to stary, ale co sem to tak prolit, tak platny.
    GORG
    GORG --- ---
    Našel jsem teď, jak k tomu dospět trošku těžkopádněji,ale samozřejmě asi by to snad mělo jít nějak implicitnějš ,)

    final float maxWidth = 2 * screenWidth/3;
    final float minWidth =Math.min(lblText.getTextBounds().width, maxWidth);

    this.add(lblText).fill().minWidth(minWidth).maxWidth(maxWidth);
    DRIZDIK
    DRIZDIK --- ---
    DATEL: Button je pouze TextView rozšířené o nastylování, takže to budeš schopen docílit jeho extendnutím a vnucením vlastního stylu a změníš scaleType u toho obrázku.
    GORG
    GORG --- ---
    https://code.google.com/p/table-layout/ tady je k tomu sice nějaké povídání, ale rád bych něco podrobnějšího, protože kolem toho mi zůstává stále mraky otazníků nejen v tomhle.
    GORG
    GORG --- ---
    Má tu někdo zkušenost s vývojem v Libgdx? Docela tápu s tím scene2d ui

    moje snaha udělat text,který se zalamuje,pokud jeho šířka překročí určitou míru (tj. aby se vešel na obrazovku)

    lblText = new Label(text, lblStyle);
    lblText.setWrap(true);
    lblText.setFillParent(true);

    this.add(lblText).fill().maxWidth(2 * screenWidth/3);

    // ta hodnota maxWidth se nicméně jeví,jako by byla ignorována. pak je tam ještě možné nastavit prefWidth,ale to se mi chová stejně, jako bych tam rovnou nastavil natvrdo hodnotu width nebo minWidth. Jinak se to chová, že to zalomí po každém písmenku.. takže to má šířku řekněme 20 px ale zato výšku 2000 px :))
    DATEL
    DATEL --- ---
    Ahoj, potřeboval bych poradit s ikonkou na tlačítku. Mám Button a v něm pomocí drawableLeft ikonku. Jenže ta ikonka se zvětšuje, místo aby zachovala originální rozměry. Už jsem narazil u group listu, když jsem tam chtěl dát vlastní ikonku, že veškeré obrázky na pozadí se roztahují a řeší se to pomocí 9-patch obrázků, což se mi moc nechce. Ten drawableLeft u Buttonu je taky brán jako pozadí?

    <Button
    android:id="@+id/contactCallButton"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:layout_margin="5dp"
    android:padding="5dp"
    android:text="@string/contactCall"
    android:textColor="@android:color/white"
    android:textSize="12sp"
    android:textStyle="bold"
    android:background="@drawable/button_green_style"
    android:drawableLeft="@drawable/button_call_image"
    android:shadowColor="@android:color/black"
    android:shadowDx="1.0"
    android:shadowDy="1.0"
    android:shadowRadius="1.0"
    android:clickable="true"
    android:onClick="onContactCallButtonClick"
    />

    Ten button_call_image jsem nejdřív měl jako přímo název souboru s obrázkem, pak jsem na základě hledání zkusil místo toho vytvořit XML, ale to taky nepomohlo.

    <?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/icon_button_call"
    android:tileMode="disabled"
    android:gravity="top"
    >
    </bitmap>

    Taky jsem hodně viděl doporučovat řešení, že místo Button se použil RelaviteLayout s ImageView a TextView, ale pak jsem u jednoho příspěvku četl, že pro seznamy by se to dělat nemělo, protože větší množství zanořených layoutů pro položku seznamu je náročné na zdroje nebo výkon nebo tak něco.

    Jak teda správně vytvořit tlačítko s ikonkou tak, aby ikonka měla své originální rozměry a neroztahovala se?

    Díky za pomoc.
    SPIRAL_FORCE
    SPIRAL_FORCE --- ---
    MRAKY: tak nechtel sem to psat primo sem...ale ok...napisu...jde o hovno. kdyz jsem pred rokem nastupoval tak jsem dostal 50 klacku + kazdy 3 mesice mame bonus ve vysi 25% platu za ty tri mesice...takze to neni uplne spatny, podle me
    MRAKY
    MRAKY --- ---
    SPIRAL_FORCE: to musi byt dost dobry ;))

    //sory za ot, ale nemohl jsem si to odpustit ;)
    SPIRAL_FORCE
    SPIRAL_FORCE --- ---
    MIRAMANEE: docela dost ;-)
    MIRAMANEE
    MIRAMANEE --- ---
    SPIRAL_FORCE: Kolik Seznam nabizi za takovou pozici? Podle toho (ne)budu mit zajem :)
    SPIRAL_FORCE
    SPIRAL_FORCE --- ---
    Nemel by nekdo zajem pracovat v Seznamu na pozici Android vyvojar? Presouvam se do jineho kanclu, tak po me zbyla dira v teamu. Kdyby nekdo mel zajem tak do posty ;-). Dik
    GORG
    GORG --- ---
    Teď mě dost zarazila jedna věc.. totiž, když jsem zjistil, že Smasung galaxy note se na androidu 2.3 tváří jako "large", ale na ICS updatu se hlásí jako "normal".

    android - Layout on Samsung Galaxy Note - Stack Overflow
    http://stackoverflow.com/questions/8711877/layout-on-samsung-galaxy-note

    Tak přemýšlím, jak nastavit android market filtr, aby mi v té normal xhdpi kategorii do toho nespadl i nějaký menší telefon.
    Rozměry se mi přizpůsobují obrazovce, ale mám to rozdělené na dvě kategorie resourců, ať se do malých telefonů netahají zbytečně obrovský textury...
    Takže to vidím tak přidat do manifestu
    <screen android:screenSize="normal" android:screenDensity="xhdpi" /> 
    
    ?
    RADDINO
    RADDINO --- ---
    Chtěl jsem vyzkoušet to nové Android studio a při vytvoření nového projektu (všechno default, nic jsem neměnil, jenom proklikal) v foldru myApp/src/main nemám žádnou class, i když by se tam zobrazit měla. Neví někdo kde jsem udělal chybu?
    ROTTWEILER
    ROTTWEILER --- ---
    MRTVY_KENNY: Tak já mam za to, že to není ani o tom nápadu, ale spíš o tom, že oni budou stát za tím nápadem, tak že i když mi ten nápad řeknou, tak já nemám na YouTube 300k subscribers, abych to dostal mezi lidi. A vsadím se, že ten jejich nápad bude to samé jako ty jejich kecy, někde něco ve světě funguje a oni to chtějí převést na úroveň v ČR.
    MRTVY_KENNY
    MRTVY_KENNY --- ---
    ROTTWEILER: btw ty bys v jejich postaveni vysolil svuj zamer na webtrh? ja teda ne.
    MRTVY_KENNY
    MRTVY_KENNY --- ---
    ROTTWEILER: asi nerozumim, jak se z tohoto daji vyzdimat hlasky, ale uz jsem v minusu. :D tak sorry, no. jeste ze je patek.
    Kliknutím sem můžete změnit nastavení reklam