2013-04-20 109 views
0

我是Android開發新手。 我有一個擴展視圖類drawView函數,它就像一個簡單的畫圖程序將View類添加到默認佈局

public class DrawView extends View implements OnTouchListener { 

    Bitmap bitmap; 
    Canvas bitmapCanvas; 
    int color; 

    // Position of finger down 
    float pX, pY; 

    // Position of finger up 
    float mX, mY; 

    // Create new path 
    Path path = new Path(); 

    // Is view initialized?! 
    boolean isInitialized; 

    // Create new paint 
    Paint paint = new Paint(); 

    int begX, begY, endX, endY = 0;   


    //DrawView constructor 
    public DrawView(Context context) { 
      // Initialize new view 
      super(context); 
      setFocusable(false); 
      setFocusableInTouchMode(false); 
      this.setOnTouchListener(this); 
      requestLayout(); 

      paint.setAntiAlias(true); 
      paint.setStyle(Style.STROKE); 

      // There is no bitmap yet 
      isInitialized = false; 
    } 

    //Initialize bitmap and canvas 
    private void init() { 

      bitmap = Bitmap.createBitmap(getWidth(), getHeight()/2, Bitmap.Config.RGB_565); 
      bitmap.setPixel(72, 72, Color.BLACK); 

      // Create new canvas and set bitmap 
      bitmapCanvas = new Canvas(); 
      bitmapCanvas.setBitmap(bitmap); 

      // ... set canvas background color 
      bitmapCanvas.drawColor(Color.WHITE); 

      // We're done with initialization 
      isInitialized = true; 
    } 

    //Reset canvas 
    public void reset(){ 
      bitmapCanvas.drawColor(Color.WHITE); 
    } 

    //Handle event 'onDraw' 
    @Override 
    public void onDraw(Canvas canvas) { 

      // Check if initialized 
      if (!isInitialized) 
        init(); 

      // Draw bitmap! 
      canvas.drawBitmap(bitmap, 0, 0, paint); 
    } 

    //Handle event 'onTouch'   
    public boolean onTouch(View view, MotionEvent event) { 
      // Check event type 

      switch (event.getAction()) { 

      // Finger down 
      case MotionEvent.ACTION_DOWN: 

        paint.setColor(Color.BLACK); 
        paint.setStrokeWidth(7f); 
        paint.setStrokeJoin(Paint.Join.ROUND); 
        paint.setStrokeCap(Paint.Cap.ROUND); 
        paint.setAntiAlias(true); 

        // Get current position 
        pX = event.getX(); 
        pY = event.getY();      

        // Set beginning of path to (posX,posY)      
        path.moveTo(pX, pY); 
        begX= (int) pX; 
        begY = (int) pY; 
        bitmapCanvas.drawPoint(pX, pY, paint); 

        break; 

      // Finger moves 
      case MotionEvent.ACTION_MOVE: 
        mX = event.getX(); 
        mY = event.getY(); 

        // Set position of end of path 
        path.lineTo(mX, mY); 
        endX = (int) mX; 
        endY = (int) mY; 

        // Draw path 
        bitmapCanvas.drawPath(path, paint); 

        // Invalidate canvas (redraw the view) 

        invalidate(); 
        break; 

      // Finger up 
      case MotionEvent.ACTION_UP: 

        mX = event.getX(); 
        mY = event.getY(); 

        if (mY == pY && mX == pX){      
         bitmapCanvas.drawPoint(pX, pY, paint); 
         invalidate(); 
        } 

        path.reset(); 
        break; 

      } 

      return true; 
    } 
} 

在我的默認佈局,我希望它包含drawView函數和其他元素(按鈕,TextView的...)

如何我可以拆分「默認佈局」以包含這些元素的DrawView嗎? 感謝

編輯: 我應該在哪裏把這個代碼,以使drawView函數正常工作

public class Draw extends Activity { 
DrawView drawView; 

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


    drawView = new DrawView(this); 
    setContentView(drawView); 
    drawView.requestFocus(); 
} 
} 

回答

1

添加您的視圖,它的全名,以你的layout.For例如:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
...> 
<TextView.../> 
<my.package.MyCustomView 

    android:id="@+id/my_view" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    /> 
<Button.../> 
</LinearLayout> 

這裏MyCustomView是擴展爲View的java類的名稱,my.package是包含該類的包的名稱。您可以看到,您可以將LayoutParams添加到它,因爲我adde d layout_height或layout_width。

編輯:

如果你想使用自定義視圖中XML佈局,你必須至少此構造函數添加到類:

public MyCustomView(Context context, AttributeSet attrs){ 
    super(context, attrs); 
    ... 
} 
+0

@Ahmad Alkurdi另一個構造函數添加到你的java CLAS重量s來解決你的bug。請參閱我的編輯。 – hasanghaforian 2013-04-20 12:49:53

+0

非常感謝你,這是對的,但我不知道爲什麼我不能在這個視圖中得出任何想法 – 2013-04-20 12:54:13

+0

@AhmadAlkurdi你的問題是什麼?你能看到你的自定義視圖,它是空白的或者你看不到它? – hasanghaforian 2013-04-20 14:34:07

0

我不知道你怎麼樣但實際上您可以根據您的要求使用任何佈局,這裏是您的視圖和另一個視圖在分屏中的簡單佈局

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    android:layout_weight="1"> 

    <TextView /> <!--your textview--> 
    <TextView /> <!--your textview--> 
    <TextView /> <!--your textview--> 
</LinearLayout> 

<com.androidapp.DrawView android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1"/> 

</LinearLayout> 

這將同等大小的視圖和嵌套LinearLayout

如果你想顯示與外包裝尺寸您的內容,然後直接刪除的重量,如果你顯示你的drawView函數的頂部,並使用wrap_content在另一個視圖分割屏幕高度或者如果你在底部顯示比讓他們在0.2或O.3什麼,但在浮點數

編輯 同時定義構造函數

public DrawView(Context context) { 
     // Initialize new view 
     super(context); 
     initObject(); 
} 

public MyCustomView(Context context, AttributeSet attrs){ 
    super(context, attrs); 
    initObject(); 
} 

private void initObject(){ 
     setFocusable(false); 
     setFocusableInTouchMode(false); 
     this.setOnTouchListener(this); 
     requestLayout(); 

     paint.setAntiAlias(true); 
     paint.setStyle(Style.STROKE); 

     // There is no bitmap yet 
     isInitialized = false; 
} 
+0

我遇到了這個bug 自定義視圖DrawView沒有使用2或3參數的View構造函數; XML屬性不起作用 – 2013-04-20 12:34:27

+0

用2作爲第一個上下文定義DrawView構造函數,AttributeSet – Pratik 2013-04-22 05:22:26