1

私の友人と私は、より大きな Android プロジェクトの一部に取り組んでいます。この部分で行う必要があるのは、ビットマップとサーフェス ビューを使用して、タッチ スクリーンに手描きを実装できるようにすることです。明確にするために、私たちが最終的に望んでいるのは、ユーザーがタッチイベントをインスタンス化したときに、適切なピクセルの色が変化することです。これにより、たとえば、ユーザーがタッチスクリーンに名前を書いた場合、その名前が手書きで表示されます。問題は、画面がタッチされたときに呼び出される無効化メソッドにあると思います。ログ出力を使用して、onDraw メソッドが呼び出されていない/使用されていないことがわかりました。ビットマップを使用する理由は、ビットマップを圧縮してネットワーク経由で送信できるためです。機能を実装するためのより良い方法があれば、提案を受け付けます。

`/**
 * 
 */
package com.example.practice_app;
import android.util.DisplayMetrics;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.SurfaceView;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.SurfaceHolder;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Color;

//Debugging packages
import android.util.Log;
import java.lang.RuntimeException;

/**
 * @author Asus
 *
 */
public class WhiteBoardView extends SurfaceView implements SurfaceHolder.Callback {


    //Class fields:
    //SurfaceHolder:
    SurfaceHolder holder;

    //Current context:
    Context currentContext;

    //Graphics:
    private DisplayMetrics metrics = new DisplayMetrics();

    //private Bitmap ourBitmap;
    private Bitmap ourBitmap;
    private Canvas ourCanvas;
    private Paint paint;
    private View myView;




    //Class Methods:
    /**
     * @param context
     */

    public WhiteBoardView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        final String CONSTRU_TAG = "Constructor";

        //Initialize class fields;
        currentContext = context;
        holder = getHolder();

        holder.addCallback(this);

        //Create the Canvas and the Bitmap:
         metrics = new DisplayMetrics();
        ((WindowManager)getWindowManager()).getDefaultDisplay().getMetrics(metrics);

        try{ourBitmap = Bitmap.createBitmap(metrics.widthPixels, metrics.heightPixels, Bitmap.Config.ARGB_8888);}
        catch(IllegalArgumentException argEr){
            Log.e("BITMAP_CREATE","Error creating the bitmap: IllegalArgumentException");
        }


        ourCanvas = new Canvas(ourBitmap);
        if(ourBitmap == null)
        {
            Log.e(CONSTRU_TAG, "ourBitmap is \"null\".");
        }
        paint = new Paint();
        paint.setColor(Color.WHITE);


    }

    private Object getWindowManager() {
        // TODO Auto-generated method stub
        return currentContext.getSystemService(Context.WINDOW_SERVICE);
    }

    /**
     * @param context
     * @param attrs
     */
    public WhiteBoardView(Context context, AttributeSet attrs) {
        super(context, attrs);

        // TODO Auto-generated constructor stub
        final String CONSTRUC_TAG2 = "Constructor(Context, AttributeSet)";
        // TODO Auto-generated constructor stub

        //Initialize class fields;
        currentContext = context;
        holder = getHolder();

        holder.addCallback(this);

        //Create the Canvas and the Bitmap:
         metrics = new DisplayMetrics();
        ((WindowManager)getWindowManager()).getDefaultDisplay().getMetrics(metrics);

        try{ourBitmap = Bitmap.createBitmap(metrics.widthPixels, metrics.heightPixels, Bitmap.Config.ARGB_8888);}
        catch(IllegalArgumentException argEr){
            Log.e("BITMAP_CREATE","Error creating the bitmap: IllegalArgumentException");
        }


        ourCanvas = new Canvas(ourBitmap);
        if(ourBitmap == null)
        {
            Log.e(CONSTRUC_TAG2, "ourBitmap is \"null\".");
        }
        paint = new Paint();
        paint.setColor(Color.WHITE);
    }

    /**
     * @param context
     * @param attrs
     * @param defStyle
     */
    public WhiteBoardView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
        final String CONSTRUC_TAG3 = "Constructr(Context, AttributeSet, int)";
        // TODO Auto-generated constructor stub

        //Initialize class fields;
        currentContext = context;
        holder = getHolder();

        holder.addCallback(this);

        //Create the Canvas and the Bitmap:
         metrics = new DisplayMetrics();
        ((WindowManager)getWindowManager()).getDefaultDisplay().getMetrics(metrics);

        try{ourBitmap = Bitmap.createBitmap(metrics.widthPixels, metrics.heightPixels, Bitmap.Config.ARGB_8888);}
        catch(IllegalArgumentException argEr){
            Log.e("BITMAP_CREATE","Error creating the bitmap: IllegalArgumentException");
        }


        ourCanvas = new Canvas(ourBitmap);
        if(ourBitmap == null)
        {
            Log.e(CONSTRUC_TAG3, "ourBitmap is \"null\".");
        }
        paint = new Paint();
        paint.setColor(Color.RED);
    }

    //Event Handlers:
    @SuppressLint("WrongCall")
    @Override
    public boolean onTouchEvent(MotionEvent e)
    {
        //Declare local variables:
        final String ONTOUCH_TAG = "onTouchEvent(MotionEvent)";
        boolean eventHandled = true;
        float x = e.getX();
        float y = e.getY();

        switch(e.getAction())
        {

        case MotionEvent.ACTION_DOWN: //Log.i(ONTOUCH_TAG, "Hurray! Touch is working!");
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
            if(((x >= 0) && (x <= ourBitmap.getWidth())) && ((y >= 0) && (y <= ourBitmap.getHeight())))
            {  

               ourBitmap.setPixel((int)x, (int)y, paint.getColor());

                   invalidate();

            }

            break;

    }
        return eventHandled;
    }

    @Override
    public void onDraw(Canvas canvas)
    {
        canvas.drawBitmap(ourBitmap, null, paint);
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }
}'

And here is the Activity that WhiteBoardView is associated with.

package com.example.practice_app;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Menu;

public class Whiteboard extends Activity {

    //Class fields:
    Bitmap ourBitmap;
    Canvas ourCanvas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //Call the superclass constructor:
        super.onCreate(savedInstanceState);

        //Get the current Device's measurements:
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);

        //Create the Bitmap and Canvas objects
        ourBitmap = Bitmap.createBitmap(metrics.widthPixels, metrics.heightPixels, Bitmap.Config.ARGB_8888);
        ourCanvas = new Canvas(ourBitmap);

        //Set the UI layout for this activity:
        setContentView(R.layout.activity_whiteboard);

    }
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.whiteboard, menu);
        return true;
    }

}
4

1 に答える 1

0

SurfaceView で描画する場合は、surfaceCreated / Updated / Destroyedメソッドを使用して で描画Surfaceする必要がありますSurfaceHolder

クラスを拡張Viewおよび実装するように変更すると、onMeasure機能するはずです。

于 2013-03-23T04:31:31.183 に答える