简体   繁体   中英

Draw bitmap on canvas by “onTouchListener” at specific position

I use Canvas to draw bitmap by touch screen but they don't show bitmap on apps.

public class MainActivity extends Activity {
    public LinearLayout screenlayout;

    public void draw (int x, int y){
        Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.dam);                     
        Canvas canvas=new Canvas(b);
        canvas.drawBitmap(b, x, y, null);
    }

    public void onCreate(Bundle saveInstanceState){
       super.onCreate(saveInstanceState);
       setContentView(R.layout.activity_main); 

       final LinearLayout screenlayout= (LinearLayout)findViewById(R.id.screenlayout);
        screenlayout.setOnTouchListener(new OnTouchListener() {
                public boolean onTouch(View v, MotionEvent event) { 
                    switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        int x = (int) event.getRawX();
                        int y = (int) event.getRawY();

                        draw(x,y);                       

                        break; 
                    case MotionEvent.ACTION_MOVE:                   
                        break; 
                    default: 
                        break; 
                    } 
                    return true;          
                   } 
            });              
    }             
 } 

try this,

in your main.xml.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
</LinearLayout>

in your MainActivity Class.

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;

public class DrawFunny extends Activity implements OnTouchListener  {
    private float x;
    private float y;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MyCustomPanel view = new MyCustomPanel(this);

        ViewGroup.LayoutParams params = 
                            new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT,
                                                       LayoutParams.FILL_PARENT);
        addContentView(view, params);
        view.setOnTouchListener(this);

    }
    private class MyCustomPanel extends View {

        public MyCustomPanel(Context context) {
            super(context);

        }
        @Override
        public void draw(Canvas canvas) {

            Paint paint = new Paint();
            paint.setColor(Color.GREEN);
            paint.setStrokeWidth(6);

            canvas.drawLine(10,10,50,50,paint);
            paint.setColor(Color.RED);

            canvas.drawLine(50, 50, 90, 10, paint);
            canvas.drawCircle(50, 50, 3, paint);

            canvas.drawCircle(x,y,3,paint);

        }
    }
    public boolean onTouch(View v, MotionEvent event) {
        x = event.getX();
        y = event.getY();

        v.invalidate();
        return true;
    }
}

As Ganpat Kaliya answer, I provide another code to solve this problem. Thanks to Ganpat Kaliya.

public class MainActivity extends Activity {

public static float vtx;
public static float vty;

@Override 
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Test view = new Test(this);

    ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
    addContentView(view, params);
    view.setOnTouchListener(new OnTouchListener(){
        public boolean onTouch(View v, MotionEvent event) {
            float a = event.getX();
            float b = event.getY();

            vtx=a;
            vty=b;
            v.invalidate();
            return true; 
        } 
    });

} 

}

And:

public class Test extends View {

public Test(Context context) {
    super(context); 
}

public void draw(Canvas canvas) {

    float x=MainActivity.vtx;
    float y=MainActivity.vty;

    Paint paint = new Paint();
    paint.setColor(Color.GREEN);
    paint.setStrokeWidth(6);

    canvas.drawLine(10,10,50,50,paint);
    paint.setColor(Color.RED);

    canvas.drawLine(50, 50, 90, 10, paint);
    canvas.drawCircle(50, 50, 3, paint);

    canvas.drawCircle(x,y,10,paint);        

    Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.dam);                     
    canvas.drawBitmap(b, x, y, null);

} 

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM