2012-06-21 22 views
7

Tôi biết có thể tạo các hoạt động bằng cách làm một cái gì đó giống như mã bên dưới, nơi khung nhìn không được đặt từ tệp xml nhưng như thế này: setContentView (mới myView (này));Cách tạo một hoạt động mà không có 'setContentView (R.layout.main)'

Những gì tôi không hiểu là làm thế nào để sử dụng mã này nhưng vẫn có khả năng tùy chỉnh nó, ví dụ nếu tôi muốn thêm một nút vào mã dưới đây, làm thế nào tôi sẽ làm điều đó, bởi vì tôi không thể chỉ cần thêm một đến một bố trí xml tôi có thể?

BẤT K G GÌ TRẢ LỜI TỐT ĐẾN NÀY S V ĐƯỢC CHỨNG NHẬN ĐƯỢC PHÊ DUYỆT cảm ơn trước!

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); 
      } 
    } 
    } 
} 

^^^^^^^^^^^^^^^ đáp

Làm thế nào để xác định vị trí các nút và ImageView? (Lý tưởng nhất là sử dụng bố trí tương đối) Các hình dưới đây cho bạn thấy những gì tôi có nghĩa là: (Bỏ qua đó hình ảnh được tái kích thước)

enter image description here MÃ MỚI:

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); 
       } 
    } 
     } 
    } 

Trả lời

14

Bạn có thể vượt qua setContentView() bất kỳ dạng xem, là chế độ xem gốc của bố cục của bạn. Dưới đây là LinearLayout được tạo động với Nút và myView của bạn.

Hiểu rằng bạn chỉ có thể thêm chế độ xem con vào chế độ xem gốc nếu bạn vượt qua setContentView() một ViewGroup; như RelativeLayout, LinearLayout, vv Nói cách khác bạn không thể làm điều này:

 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); 

Ngoài ra, quy ước đặt tên gợi ý rằng mỗi từ trong một tên lớp nên có chữ cái đầu tiên viết hoa. Vì vậy, myView phải là MyView, ở mức tối thiểu nó làm cho mã của bạn dễ đọc hơn cho các lập trình viên khác và trình biên dịch sẽ làm nổi bật các biến lớp của bạn với màu sắc chính xác.

+0

Cảm ơn rất nhiều Sam, tôi đã làm việc đó. Vấn đề duy nhất của tôi bây giờ là định vị các mục, chẳng hạn như nút và imageView được tạo bởi myView/onDraw. Ill cập nhật câu hỏi để cho bạn biết ý tôi là gì. :) – user1472757

+0

Tôi đoán bạn có thể làm điều đó bằng cách bố trí RelativeLayout = new RelativeLayout (this); Nhưng làm cách nào tôi có thể định vị nút và hình ảnh ?, Cảm ơn – user1472757

+0

@ user1472757 Tôi đã cập nhật mã trong câu trả lời của mình. Mỗi thuộc tính có thể được thiết lập trong XML hoặc Java, trong Hướng dẫn của nhà phát triển, các thuộc tính XML có một "phương thức liên quan" là một hàm Java đồng nghĩa (ví dụ cho LinearLayout 'android: orientation' là' setOrientation() '). – Sam

Các vấn đề liên quan