2012-06-21 42 views
7

我知道它可以通过做类似代码的下列代码来创建活动,其中视图不是从xml文件设置的,但是像这样:setContentView(new MyView的(本));如何在没有'setContentView(R.layout.main)'的情况下创建一个活动'

我不明白的是如何使用此代码,但仍然有能力定制它,例如,如果我想添加一个按钮的代码波纹管,我将如何做,因为我不能简单地添加一个到XML布局可以吗?

对此的任何有益的答案将非常感谢 在此先感谢!

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

^^^^^^^^^^^^^^^ 回答

如何定位按钮和ImageView的? (理想情况下使用相对布局) 图片波纹管显示你明白我的意思: (忽略了图像的尺寸重新调整)

​​ NEW CODE:

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

回答

14

可以传递的setContentView()的任何视图的形式,作为您的布局的根视图。下面是一个动态构建的LinearLayout,带有一个Button和您的myView

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

了解您只能将子视图添加到您的根视图,如果您传递setContentView()ViewGroup;喜欢的RelativeLayout,LinearLayout中,等换句话说,你不能做到这一点:

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

此外,命名规则表明,在类名的每个单词应该有第一个字母大写。因此,myView应该是MyView,至少它使您的代码更容易阅读其他程序员,编译器将用正确的颜色突出显示您的类变量。

+0

非常感谢Sam,我让它工作。我现在唯一的问题是定位项目,比如由myView/onDraw创建的按钮和imageView。我会更新这个问题来向你展示我的意思。 :) – user1472757

+0

我猜你可以通过RelativeLayout layout = new RelativeLayout(this)来做到这一点。但是,如何定位按钮和imageview ?,谢谢 – user1472757

+0

@ user1472757我更新了我的答案中的代码。每个属性可以设置为XML或Java,在开发者指南中,XML属性具有一个“相关方法”,这是一个同义的Java函数(即LinearLayout的android:orientation是setOrientation())。 – Sam

相关问题