2015-09-02 4 views
1

Я пытаюсь нарисовать холст, который содержит круг на вид, который был определен ранее через findViewById(), как этогоAndroid: рисование холста на вид

View v = findViewById(R.id.view1); 
    Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(b); 
    Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.FILL); 
    paint.setColor(Color.WHITE); 
    c.drawCircle(v.getMeasuredWidth()/2, v.getMeasuredHeight()/2, v.getMeasuredWidth()/4, paint); 
    v.draw(c); 

но нет круга, нарисованного на вид

вся моя деятельность:

package com.burrlieexample.test; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class InstructionsActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d("DEBUG", "InstruciotnActivity"); 
     setContentView(R.layout.activity_instructions); 

     Button okay = (Button) findViewById(R.id.okButton); 
     okay.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       finish(); 
      } 
     }); 

    } 

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     // TODO Auto-generated method stub 
     super.onWindowFocusChanged(hasFocus); 
     Log.d("DEBUG", "onFocusChanged"); 
//im doing this stuff in onWindowfocusChanged because getWidth returns 0 in onCreate 
     View v = findViewById(R.id.view1); 
     Log.d("DEBUG", "" + v.getMeasuredWidth() + ", " + v.getMeasuredHeight()); 
     Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 
     Canvas c = new Canvas(b); 
     Paint paint = new Paint(); 
     paint.setStyle(Paint.Style.FILL); 
     paint.setColor(Color.WHITE); 
     c.drawCircle(v.getMeasuredWidth()/2, v.getMeasuredHeight()/2, v.getMeasuredWidth()/4, paint); 
     v.draw(c); 

    } 


    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
    } 
} 

вид и в моем макета XML-файл, как этот

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#D0F3FF" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.burrlieexample.test.InstructionsActivity" > 

    <Button 
     android:id="@+id/okButton" 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="52dp" 
     android:background="#00455F" 
     android:hapticFeedbackEnabled="true" 
     android:text="Ok!" /> 

    <View 
     android:id="@+id/view1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/okButton" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" /> 

</RelativeLayout> 

Таким образом, когда активность начинает единственные вещи я вижу, кнопка и на фоне моего родственника макета

+0

читайте это: http://developer.android.com/guide/topics/ui/custom-components.html и это: http://developer.android.com/training/custom-views/index.html – pskink

ответ

3

сделать это так же просто: Нарисовав круг по просмотру Drawing для просмотра лучшего варианта, когда ваш UI не требует динамических изменений в приложении. Этого можно добиться простым расширением класса View и определением метода обратного вызова onDraw(). Внутри объекта onDraw() компонента View View используйте Canvas для вашего чертежа, используя различные методы Canvas.draw ...() (Пример: canvas.drawCircle (x/2, y/2, radius, paint);). onDraw() - это метод обратного вызова, вызываемый при первоначальном обращении.

public class MainActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new MyView(this)); 
    } 

    public class MyView extends View { 
     public MyView(Context context) { 
       super(context); 
       // TODO Auto-generated constructor stub 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      // TODO Auto-generated method stub 
      super.onDraw(canvas); 
      int x = getWidth(); 
      int y = getHeight(); 
      int radius; 
      radius = 100; 
      Paint paint = new Paint(); 
      paint.setStyle(Paint.Style.FILL); 
      paint.setColor(Color.WHITE); 
      canvas.drawPaint(paint); 
      // Use Color.parseColor to define HTML colors 
      paint.setColor(Color.parseColor("#CD5C5C")); 
      canvas.drawCircle(x/2, y/2, radius, paint); 
     } 
    } 
} 
+1

1) нет 'super.onDraw()' необходимо, 2) не выделять никаких объектов в методе 'onDraw', 3) почему эта странная привычка использовать' Color.parseColor («# CD5C5C») '? – pskink

+0

спасибо за решение, но когда я делаю это так, как я не могу использовать свою кнопку больше? потому что я установил представление содержимого в мое представление v и только для своего вида v. Я немного его перепутал, так что у меня есть макет с кнопкой и вид в нем, на который я могу нарисовать холст. – Darius

+0

И как бы это можно сделать в фрагменте @pskink? – Anders8

0
View v = findViewById(R.id.view1); 
    Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(b); 
    Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.FILL); 
    paint.setColor(Color.WHITE); 
    c.drawCircle(v.getMeasuredWidth()/2, v.getMeasuredHeight()/2, v.getMeasuredWidth()/4, paint); 
    v.draw(c); 

Причина этого не делать ничего, что вы на самом деле не делать ничего. По крайней мере, ничего не последовательное.

  • У вас есть представление.
  • Вы сделали растровое изображение размера этого вида.
  • У вас есть объект холста для этого растрового изображения.
  • Вы определили краску.
  • Вы рисуете круг на холсте, который помещает его в это растровое изображение.
  • Вы отправили объект холста растрового изображения в функцию рисования вида, чтобы ничего не рисовал на нем, так как представление полностью пустое.
  • Затем вы даете мусорную корзину есть все.

Повторите для меня. Это ничего не делает!

Пара решений. Внутри представления переопределите функцию onDraw (Canvas) и нарисуйте круг. Измените тип представления на то, что рисует растровое изображение как ImageView, так и ImageButton, а затем установите для этого растрового изображения фактическое растровое изображение, на которое обращается внимание (и удалите эту vsdraw (c) ерунду). Вы также можете отказаться от этого взгляда ерундой и включить в свой код прямо в свой код. В XML вы можете определить способность для круга. Затем поместите этот круговой круг, где бы вы ни захотели. Это зависит от варианта использования.

Но, как есть, это не код, который ничего не спасет. Это еда для мусора.

Смежные вопросы