2012-06-19 21 views
7

Chcę, aby aplikacja, podobnie jak ekran powitalny systemu Android. Dynamicznie dodaje obrazy do wierszy tableLayout. Mam zdefiniowane tylko tableLayout w pliku xml, a pozostały kod jest w java. Dodałem obrazy z powodzeniem, ale nie otrzymuję pomocy przy ustawianiu tekstu tego obrazu (chcę wyświetlać tekst pod obrazem), a obrazem jest specjalne obicie. Jak to zrobić? Z góry dziękuję.Dodaj tekst do obrazu w Androidzie programowo

+1

Proponuję użyć GridView. –

Odpowiedz

8

Co można zrobić, to zamiast położyć TextView w nakładce do ImageView użyciu RelativeLayout :)

+0

Tak. Zrobiłem to teraz. Udało mi się dodać FrameLayout w wierszach tabeli i wszystko działało dobrze. Dziękuję wszystkim. – dka72

+0

To najlepsze opcje. Łatwe, lekkie i dobre osiągi – StErMi

+1

Badass idea -.- +1 – khandelwaldeval

27

Poniższa funkcja wpisywania tekstu na obrazy:

private BitmapDrawable writeTextOnDrawable(int drawableId, String text) { 

    Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId) 
      .copy(Bitmap.Config.ARGB_8888, true); 

    Typeface tf = Typeface.create("Helvetica", Typeface.BOLD); 

    Paint paint = new Paint(); 
    paint.setStyle(Style.FILL); 
    paint.setColor(Color.WHITE); 
    paint.setTypeface(tf); 
    paint.setTextAlign(Align.CENTER); 
    paint.setTextSize(convertToPixels(mContext, 11)); 

    Rect textRect = new Rect(); 
    paint.getTextBounds(text, 0, text.length(), textRect); 

    Canvas canvas = new Canvas(bm); 

    //If the text is bigger than the canvas , reduce the font size 
    if(textRect.width() >= (canvas.getWidth() - 4))  //the padding on either sides is considered as 4, so as to appropriately fit in the text 
     paint.setTextSize(convertToPixels(mContext, 7));  //Scaling needs to be used for different dpi's 

    //Calculate the positions 
    int xPos = (canvas.getWidth()/2) - 2;  //-2 is for regulating the x position offset 

    //"- ((paint.descent() + paint.ascent())/2)" is the distance from the baseline to the center. 
    int yPos = (int) ((canvas.getHeight()/2) - ((paint.descent() + paint.ascent())/2)) ; 

    canvas.drawText(text, xPos, yPos, paint); 

    return new BitmapDrawable(getResources(), bm); 
} 



public static int convertToPixels(Context context, int nDP) 
{ 
    final float conversionScale = context.getResources().getDisplayMetrics().density; 

    return (int) ((nDP * conversionScale) + 0.5f) ; 

} 
+0

Jak dodać pogrubiony tekst do bitmapy? czy są jakieś opcje? plz poprowadź mnie. –

+0

Twoja metoda zadziałała dla mnie, z wyjątkiem rozmiaru tekstu. Musiałem ustawić rozmiar tekstu (x5), aby twoja wartość była czytelna w moim drawable ikony. może to być spowodowane skalą konwersji dla mojego urządzenia. dzięki! – droideckar

+3

co tu jest mContext? –

2

I m powodzeniem wdrożone takie problem z dodawaniem tekstu na obrazie. Wystarczy spojrzeć na następujący kod. Najpierw wybierz jeden widok jako Układ względny w tym układzie, a następnie ImageView po tym EditText i po tym przycisku. Podaj każdy identyfikator. Napisz poniżej funkcję loadBitmapFromView.

public Bitmap loadBitmapFromView(View v) { 
     Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Config.ARGB_8888); 
     Canvas c = new Canvas(b); 
     v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom()); 
     v.draw(c); 
     return b; 
    } 

i po kliknięciu przycisku.

   Bitmap bitmap = loadBitmapFromView(relativeLayout); 
       File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),   "folderName"); 
       if (!dir.exists()) 
        dir.mkdirs(); 

       File file = new File(dir, "capture.jpg"); 
       try { 
        FileOutputStream fos = new FileOutputStream(file); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
        imageView.setImageBitmap(bitmap);  
       } catch (Exception e) { 
        Log.e("ExpressionEditImageActivity", "Error, " + e); 
       } 

Enjoy ...

Dalsze odniesienia, patrz poniżej zrzucie: enter image description here

+0

dzięki za to miłe rozwiązanie. możesz pomóc z linią kodu 'Bitmap bitmap = loadBitmapFromView (relativeLayout)' Nie jestem w stanie uzyskać 'referencji' do' relativeLayout' ... jeśli podam 'ID'' RelativeLayout', którego nie akceptuje to. Czy możesz wyjaśnić trochę. Dzięki –

+1

Przekaż widok nadrzędny, W moim przypadku jest to układ względny. –

+0

cóż .. nie jestem w stanie tego sobie wyobrazić. czy mógłbyś wyjaśnić trochę więcej za pomocą przykładowego kodu ... dzięki! –