2013-04-20 3 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 및 기타 요소를 포함 할 같은

방법입니다 이러한 요소를 사용하여 DrawView가 포함되도록 "기본 레이아웃"을 분할 할 수 있습니까? 감사

편집 : 나는 그것이 당신의 layout.For 예를 들어 전체 이름입니다 제대로

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

이보기를 추가 DrawView 작업을 만들기 위해이 코드를 삽입한다 : 여기

<?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> 

MyCustomViewViewmy.package을 확장하는 Java 클래스의 이름은 해당 클래스가 들어있는 패키지의 이름입니다.이 코드에서 LayoutParams을 추가 할 수 있음을 알 수 있습니다. d layout_height 또는 layout_width.

편집 : 당신이 XML 레이아웃에 사용자 정의보기를 사용하려면

것은, 당신이 당신의 클래스에 이상이 생성자를 추가해야합니다 :

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

@Ahmad Alkurdi 정의 어떤하지만 부동 소수점에서 0.2 o.3 그들에게 비중을보다 하단에 표시하는 경우 당신의 버그를 해결하겠습니다. 제 편집문을보십시오. – hasanghaforian

+0

대단히 감사합니다. 올바르게 끝났지 만 왜이 그림에서 어떤 생각을 그릴 수 없는지 모르겠다. –

+0

@AhmadAlkurdi 무엇이 문제인가? 사용자 정의보기를 볼 수 있으며 비어 있거나 볼 수 없습니까? 그것? – hasanghaforian

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를 사용하는 경우 다음 단지 무게를 제거 랩 크기 콘텐츠를 표시 할 경우 또 다른보기에서 화면을 분할합니다 높이 또는 당신은

편집 이 자바 제공자 라이선스 계약에 다른 생성자를 추가 모두 생성자

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

이 버그가 발생했습니다 사용자 정의보기 DrawView가 2 또는 3 인수보기 생성자를 사용하지 않습니다. XML 속성이 작동하지 않음 –

+0

첫 번째 컨텍스트로 2를 사용하여 DrawView 생성자를 정의하십시오. AttributeSet – Pratik

관련 문제