2012-06-21 15 views
7

Görünümün xml dosyasından ayarlanmadığı, ancak aşağıdaki gibi bir şey yaparak aktiviteler oluşturmayı mümkün olduğunu biliyorum: setContentView (new myview (bu));'setContentView (R.layout.main)' olmadan bir etkinlik nasıl oluşturulur?

Neyi anlamadığım bu kodun nasıl kullanılacağıdır, ancak yine de özelleştirilebilme özelliğine sahiptir, örneğin kodun içine bir düğme eklemek istediğimde, bunu nasıl yaparım, çünkü basitçe ekleyemiyorum bir xml düzenine kadar ben yapabilir miyim?

HERHANGİ BİR İYİ CEVAP VERMEKTEDİR, ÇOK UYGUN şimdiden teşekkürler!

package com.faceapp; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PointF; 
import android.media.FaceDetector; 
import android.media.FaceDetector.Face; 
import android.os.Bundle; 
import android.view.View; 

public class FaceappActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.main); 
     setContentView(new myView(this)); 
    } 

    private class myView extends View{ 

    private int imageWidth, imageHeight; 
    private int numberOfFace = 5; 
    private FaceDetector myFaceDetect; 
    private FaceDetector.Face[] myFace; 
    float myEyesDistance; 
    int numberOfFaceDetected; 

    Bitmap myBitmap; 


    public myView(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 

    BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); 
    BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; 
    myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.face5, 
     BitmapFactoryOptionsbfo); 
    imageWidth = myBitmap.getWidth(); 
    imageHeight = myBitmap.getHeight(); 
    myFace = new FaceDetector.Face[numberOfFace]; 
    myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); 
    numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 

      canvas.drawBitmap(myBitmap, 0, 0, null); 

      Paint myPaint = new Paint(); 
      myPaint.setColor(Color.GREEN); 
      myPaint.setStyle(Paint.Style.STROKE); 
      myPaint.setStrokeWidth(3); 

      for(int i=0; i < numberOfFaceDetected; i++) 
      { 
      Face face = myFace[i]; 
      PointF myMidPoint = new PointF(); 
      face.getMidPoint(myMidPoint); 
    myEyesDistance = face.eyesDistance(); 
      canvas.drawRect(
       (int)(myMidPoint.x - myEyesDistance), 
       (int)(myMidPoint.y - myEyesDistance), 
       (int)(myMidPoint.x + myEyesDistance), 
       (int)(myMidPoint.y + myEyesDistance), 
       myPaint); 
      } 
    } 
    } 
} 

^^^^^^^^^^^^^^^ nasıl düğmesi ve ImageView konumlandırmak için

Yanıtlanmış?

enter image description here YENİ KOD (imajının geri büyüklüğünde olduğunu Ignore):

package com.test; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PointF; 
import android.media.FaceDetector; 
import android.media.FaceDetector.Face; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.LinearLayout; 

public class TesttActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     LinearLayout layout = new LinearLayout(this); 
     Button button = new Button(this); 
     button.setText("Button!"); 
     layout.addView(button); 

     myView custom = new myView(this); 
     layout.addView(custom); 

     setContentView(layout); 
    } 

    private class myView extends View{ 

     private int imageWidth, imageHeight; 
     private int numberOfFace = 5; 
     private FaceDetector myFaceDetect; 
     private FaceDetector.Face[] myFace; 
     float myEyesDistance; 
     int numberOfFaceDetected; 

     Bitmap myBitmap; 


     public myView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 

     BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); 
     BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; 
     myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.face5, 
     BitmapFactoryOptionsbfo); 
     imageWidth = myBitmap.getWidth(); 
     imageHeight = myBitmap.getHeight(); 
     myFace = new FaceDetector.Face[numberOfFace]; 
     myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); 
     numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 

       canvas.drawBitmap(myBitmap, 0, 0, null); 

       Paint myPaint = new Paint(); 
       myPaint.setColor(Color.GREEN); 
       myPaint.setStyle(Paint.Style.STROKE); 
       myPaint.setStrokeWidth(3); 

       for(int i=0; i < numberOfFaceDetected; i++) 
       { 
       Face face = myFace[i]; 
       PointF myMidPoint = new PointF(); 
       face.getMidPoint(myMidPoint); 
     myEyesDistance = face.eyesDistance(); 
       canvas.drawRect(
        (int)(myMidPoint.x - myEyesDistance), 
        (int)(myMidPoint.y - myEyesDistance), 
        (int)(myMidPoint.x + myEyesDistance), 
        (int)(myMidPoint.y + myEyesDistance), 
        myPaint); 
       } 
    } 
     } 
    } 

cevap

14

Sen (setContentView geçebilir) Herhangi resim feryat ne demek istediğimi gösterir (İdeal göreceli düzeni kullanarak) görünümünüzün şekli, düzeninizin kök görünümüdür. Aşağıda bir Düğme ve myView ile dinamik olarak oluşturulmuş bir LinearLayout.

public class Example extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     LinearLayout layout = new LinearLayout(this); 
     // Define the LinearLayout's characteristics 
     layout.setGravity(Gravity.CENTER); 
     layout.setOrientation(LinearLayout.VERTICAL); 

     // Set generic layout parameters 
     LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 

     Button button = new Button(this); 
     button.setText("Button!"); 
     layout.addView(button, params); // Modify this 

     myView custom = new myView(this); 
     layout.addView(custom, params); // Of course, this too 

     setContentView(layout); 
    } 
} 

Eğer setContentView() Bir ViewGroup geçirirseniz yalnızca kök görünümüne çocuk görünümleri ekleyebilmeniz anlayın; vb RelativeLayout, LinearLayout gibi Başka bir deyişle bunu yapabilirsiniz:

 myView custom = new myView(this); 

     Button button = new Button(this); 
     button.setText("Button!"); 

     custom.addView(button); 
     // Nope! Method "addView()" does not exist for a regular View... 

     setContentView(custom); 

Ayrıca adlandırma kuralı sınıf adında her kelime büyük harfle olması gerektiğini göstermektedir. Yani myViewMyView olmalıdır, en azından diğer programcılar için kodunuzun okunmasını kolaylaştırır ve derleyici sınıf değişkenlerinizi doğru renkle vurgulayacaktır.

+0

Sam teşekkürler, çalışıyorum. Benim tek sorun şu ki, düğme ve myView/onDraw tarafından oluşturulan imageView gibi öğeleri konumlandırıyor. Ne demek istediğimi göstermek için soruyu güncelleyeceğim. :) – user1472757

+0

RelativeLayout layout = new RelativeLayout (this); Ama düğme ve görüntüyü nasıl konumlandırabilirim ?, Teşekkürler – user1472757

+0

@ user1472757 Cevabımdaki kodu güncelledim. Her bir öznitelik, XML veya Java'da ayarlanabilir, Geliştirici Kılavuzunda XML öznitelikleri, eş anlamlı bir Java işlevi olan bir "ilgili yöntem" e sahiptir (yani, LinearLayout için "android: orientation", "setOrientation()"). – Sam

İlgili konular