2010-11-12 3 views
4

J'ai démarré un projet de test juste pour l'obtenir. Aucun changement au fichier main.xml. Je veux créer un ImageView de taille de widget (80x100) qui contient un bitmap converti à partir d'un TextView. Oui, ça sonne très rond mais c'est juste pour tester; à la fin je veux que l'ImageView ait une image de fond et plusieurs TextViews. Je ne suis pas sûr exactement ce que je fais mal, mais rien n'est poussé à l'écran.Conversion d'un TextView-> Bitmap-> ImageView, et rien ne s'affiche

Est-ce un problème de déclarer TextView/ImageView et de le passer "this" dans le constructeur? Est-ce un problème avec mon layoutParams? Voici le code:

package com.doaf.testproject; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class TestProject extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     TextView tv = new TextView(this); 
     LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(80, 100); 
     tv.setLayoutParams(layoutParams); 
     tv.setText("testing 1 2 3"); 
     tv.setTextColor(0xFFFFFF); 
     tv.setBackgroundColor(0x555555); 

     Bitmap testB; 
     testB = loadBitmapFromView(tv); 

     ImageView iv = new ImageView(this); 
     iv.setLayoutParams(layoutParams); 
     iv.setBackgroundColor(0x555555); 
     iv.setImageBitmap(testB); 

     setContentView(iv); 
    } 

    public static Bitmap loadBitmapFromView(View v) { 
     Bitmap b = Bitmap.createBitmap(80, 100, Bitmap.Config.ARGB_8888); 
     Canvas c = new Canvas(b); 
     v.layout(0, 0, 80, 100); 
     v.draw(c); 
     return b; 
    } 
} 

Merci pour toute aide que vous pouvez fournir. Je suis relativement nouveau à Android, et assez perdu avec celui-ci.

+0

Cela semble être une très mauvaise idée. – Falmarri

+0

@ Rockmaninoff: Utilisez-vous la disposition personnalisée? –

+0

@Tilsan The Fighter: Je prévois d'utiliser une mise en page personnalisée. L'intention finale est de générer un LinearLayout constitué d'une image d'arrière-plan facultative et de quelques TextViews, puis d'exporter ce LinearLayout vers un Bitmap, puis vers l'arrière-plan d'un widget (ImageView?). – Rockmaninoff

Répondre

7

Je crois que la prise de tout l'écran parce que vous ne disposez pas d'un récipient tel qu'une disposition linéaire qui contient ensuite un ImageView avec des contraintes de disposition, de sorte que ImageView se développe pour remplir l'écran disponible. Essayez ceci:

@Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     TextView tv = new TextView(this); 
     LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(80, 100); 
     tv.setLayoutParams(layoutParams); 
     tv.setText("testing 1 2 3"); 
     tv.setTextColor(Color.BLACK); 
     tv.setBackgroundColor(Color.TRANSPARENT); 

     Bitmap testB; 

     testB = Bitmap.createBitmap(80, 100, Bitmap.Config.ARGB_8888); 
     Canvas c = new Canvas(testB); 
     tv.layout(0, 0, 80, 100); 
     tv.draw(c); 

     ImageView iv = (ImageView)findViewById(R.id.menuIcon); 
     iv.setLayoutParams(layoutParams); 
     iv.setBackgroundColor(Color.GRAY); 
     iv.setImageBitmap(testB); 
     iv.setMaxHeight(80); 
     iv.setMaxWidth(80); 
    } 

Et dans votre fichier main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

    <ImageView android:id="@+id/menuIcon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 


</LinearLayout> 

Je ne suis pas sûr de ce que vous voulez atteindre, mais je suis sûr qu'il ya des moyens plus efficaces de l'aborder.

1

modification rapide du code, essayez et voyez si c'est ce que vous voulez archieve:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    TextView tv = new TextView(this); 
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(80, 100); 
    tv.setLayoutParams(layoutParams); 
    tv.setText("testing 1 2 3"); 
    tv.setTextColor(Color.BLACK); 
    tv.setBackgroundColor(Color.TRANSPARENT); 

    Bitmap testB; 

    testB = Bitmap.createBitmap(80, 100, Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(testB); 
    tv.layout(0, 0, 80, 100); 
    tv.draw(c); 

    ImageView iv = new ImageView(this); 
    iv.setLayoutParams(layoutParams); 
    iv.setBackgroundColor(Color.GRAY); 
    iv.setImageBitmap(testB); 

    setContentView(iv); 
} 
+1

Salut Mike, C'est certainement un pas dans la bonne direction. L'arrière-plan et le texte sont rendus, mais ils remplissent tout l'écran. Pourriez-vous expliquer pourquoi ce code spécifique fonctionne et le mien n'a pas (essayant d'apprendre ici), et peut-être pourquoi il pourrait remplir l'écran? Mon intuition est que cela a à voir avec le layoutParams ... ou peut-être que iv doit être placé à l'intérieur d'une mise en page pour l'empêcher de remplir l'écran. Merci! – Rockmaninoff

1

Votre TextView doit être mesuré (call measure()) et mis en page (call layout()) avant de pouvoir être dessiné. Vous ne faites ni l'un ni l'autre.