2012-06-21 15 views
7

के बिना कोई गतिविधि कैसे बनाएं, मुझे कोड बेलो जैसे कुछ करने से गतिविधियां बनाना संभव है, जहां दृश्य xml फ़ाइल से सेट नहीं है, लेकिन इस तरह: setContentView (नया MyView (यह));'setContentView (R.layout.main)'

मुझे समझ में नहीं आता कि इस कोड का उपयोग कैसे करें, लेकिन अभी भी इसे अनुकूलित करने की क्षमता है, उदाहरण के लिए यदि मैं कोड को बटन जोड़ना चाहता हूं, तो मैं इसे कैसे करूँगा, क्योंकि मैं बस जोड़ नहीं सकता एक एक्सएमएल लेआउट में से एक मैं कर सकता हूँ?

इस पर बहुत अच्छे उत्तर दिए गए बहुत ही स्वीकृत अग्रिम धन्यवाद!

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 स्थिति के लिए? (आदर्श रूप में रिश्तेदार लेआउट का उपयोग कर) चित्र bellow आपको पता चलता है मैं क्या मतलब है: (ध्यान न दें कि छवि का आकार बदल दिया है)

enter image description here नए कोड:

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 पारित कर सकते हैं() किसी भी दृश्य के रूप में, अपने लेआउट का मूल दृश्य होना। नीचे एक बटन और आपके 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); 

इसके अलावा, नामकरण सम्मेलन पता चलता है कि एक वर्ग नाम के प्रत्येक शब्द पहला अक्षर बड़ा होना चाहिए। तो myViewMyView होना चाहिए, कम से कम यह आपके प्रोग्राम को अन्य प्रोग्रामर के लिए पढ़ने में आसान बनाता है और संकलक सही रंग के साथ आपकी कक्षा चर को हाइलाइट करेगा।

+0

धन्यवाद सैम, मुझे यह काम मिल गया। मेरा एकमात्र मुद्दा अब आइटम्स को स्थिति में रख रहा है, जैसे कि बटन और छवि व्यू myView/onDraw द्वारा बनाई गई है। मैं आपको यह दिखाने के लिए प्रश्न का अद्यतन करता हूं कि मेरा क्या मतलब है। :) – user1472757

+0

मुझे लगता है कि आप इसे रिलेटिव लेआउट लेआउट = नया रिलेवेटिवआउट (यह) द्वारा कर सकते हैं; लेकिन मैं बटन और छविदृश्य को कैसे स्थापित कर सकता हूं ?, धन्यवाद – user1472757

+0

@ user1472757 मैंने अपने उत्तर में कोड अपडेट किया। प्रत्येक विशेषता को या तो एक्सएमएल या जावा में सेट किया जा सकता है, डेवलपर गाइड में एक्सएमएल विशेषताओं में एक "संबंधित विधि" होती है जो एक समानार्थी जावा फ़ंक्शन है (यानी लीनियरलाउट 'एंड्रॉइड: ओरिएंटेशन' के लिए 'setOrientation()') है। – Sam