嗨,我正在尝试在我的活动中使用Canvas在ImageView上绘制草图,其中通过在活动中拍照来填充图像。我已指定Ontouchlistner在触摸位置上的图像上绘制草图,但并没有使我的触摸侦听器准确。即,当我触摸显示器时,草图是在另一个位置而不是在我触摸的位置上创建的。

    public class MainActivity extends AppCompatActivity implements SaveAction, View.OnTouchListener {
    private ImageView image;
    private static final int CAMERA_REQUEST = 1888;
    final Context context = this;
    Bitmap alterdbitmap;
    Internet_checking mconnectionchecking;
    AlertDialog ald;
    public static final int MEDIA_TYPE_IMAGE = 1;
    private static final String IMAGE_DIRECTORY_NAME = "View Share";
    private Uri fileUri;
    FloatingActionButton fab,fab1;
    Canvas canvas;
    Paint paint;
    Matrix matrix;
    float downx = 0;
    float downy = 0;
    float upx = 0;
    float upy = 0;
    RelativeLayout rlayout;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        image = (ImageView) findViewById(R.id.img);
        rlayout = (RelativeLayout)findViewById(R.id.rltive1);
        camera();
    }

    @Override
    protected void onResume() {
        super.onResume();
        functionality();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_REQUEST) {
            if (resultCode == RESULT_OK) {
//                Bitmap photo = (Bitmap) data.getExtras().get("data");
//               image.setImageBitmap(photo);
                previewimage();

            } else if (resultCode == RESULT_CANCELED) {
                AlertDialog.Builder alert = new AlertDialog.Builder(context);
                alert.setTitle("Error");
                alert.setCancelable(false);
                alert.setMessage("NO IMAGE FOUND");
                alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                        Intent intent = getIntent();
                        overridePendingTransition(0, 0);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                        finish();
                        overridePendingTransition(0, 0);
                        startActivity(intent);
                    }
                });
                ald = alert.create();
                ald.show();
            } else {
                Toast.makeText(getApplicationContext(),
                        "Sorry! Failed to capture image", Toast.LENGTH_LONG)
                        .show();
            }
        }
    }

    @TargetApi(23)
    private void previewimage() {

        try {
            image.setVisibility(View.VISIBLE);
            BitmapFactory.Options options = new BitmapFactory.Options();


//        options.inSampleSize = 8;

            final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), options);



            alterdbitmap = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig());
            canvas = new Canvas(alterdbitmap);
            paint = new Paint();
            paint.setColor(Color.parseColor("#FF5722"));
            paint.setStrokeWidth(5);
            matrix = new Matrix();
            canvas.drawBitmap(bitmap, matrix, paint);

            image.setImageBitmap(alterdbitmap);
            image.setOnTouchListener(this);
//            rlayout.setOnTouchListener(this);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    //    @Override
//    public boolean onCreateOptionsMenu(Menu menu) {
//        // Inflate the menu; this adds items to the action bar if it is present.
//        getMenuInflater().inflate(R.menu.menu_main, menu);
//        return true;
//    }
//
//    @Override
//    public boolean onOptionsItemSelected(MenuItem item) {
//        // Handle action bar item clicks here. The action bar will
//        // automatically handle clicks on the Home/Up button, so long
//        // as you specify a parent activity in AndroidManifest.xml.
//        int id = item.getItemId();
//
//        //noinspection SimplifiableIfStatement
//        if (id == R.id.action_settings) {
//            return true;
//        }
//
//        return super.onOptionsItemSelected(item);
//    }


    private void functionality() {

        fab1=(FloatingActionButton)findViewById(R.id.fab1);
        fab = (FloatingActionButton)findViewById(R.id.fab);
//        mbtn = (Button) findViewById(R.id.btn1);
        mconnectionchecking = new Internet_checking(this);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mconnectionchecking.isNetworkAvailable() == true) {


                    final File photoFile = new File(getFilesDir(), String.valueOf(image));
                    Intent nt = new Intent(Intent.ACTION_SEND, Uri.fromFile(photoFile));
                    String title = getResources().getString(R.string.Share_Via);
                    Intent chooser = Intent.createChooser(nt, title);
                    startActivity(chooser);


                } else {
                    AlertDialog.Builder at = new AlertDialog.Builder(context);
                    at.setTitle("Connection Error");
                    at.setCancelable(true);
                    at.setMessage("Internet connection required");
                    at.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            startActivity(new Intent(Settings.ACTION_SETTINGS));
                        }
                    });

                    ald = at.create();
                    ald.show();

                }
            }
        });
        fab1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                camera();
            }
        });

    }

    private void camera(){
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

        startActivityForResult(cameraIntent, CAMERA_REQUEST);
    }

    @Override
    public void onBackPressed() {
        moveTaskToBack(true);
    }

    public Uri getOutputMediaFileUri(int type) {
        return Uri.fromFile(getOutputMediaFile(type));
    }

    private static File getOutputMediaFile(int type) {

        // External sdcard location
        File mediaStorageDir = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                IMAGE_DIRECTORY_NAME);

        // Create the storage directory if it does not exist
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
                        + IMAGE_DIRECTORY_NAME + " directory");
                return null;
            }
        }

        // Create a media file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                Locale.getDefault()).format(new Date());
        File mediaFile;
        if (type == MEDIA_TYPE_IMAGE) {
            mediaFile = new File(mediaStorageDir.getPath() + File.separator
                    + "IMG_" + timeStamp + ".jpg");
        } else {
            return null;
        }
        return mediaFile;
    }


    @Override
    public void autosave() {

    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                downx = event.getX();
                downy = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                upx = event.getX();
                upy = event.getY();
                canvas.drawLine(downx, downy, upx, upy, paint);
                image.invalidate();
                downx = upx;
                downy = upy;
                break;
            case MotionEvent.ACTION_UP:
                upx = event.getX();
                upy = event.getY();
                canvas.drawLine(downx, downy, upx, upy, paint);
                image.invalidate();
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            default:
                break;
        }
        return true;
    }
}


activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#e0080809"
    tools:context="mypckage name.MainActivity">

    <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/rltive1">

    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/img"
        android:scaleType="fitXY"
        android:layout_alignParentTop="true" />

        <!--<Button-->
            <!--android:layout_width="50dp"-->
            <!--android:layout_height="50dp"-->
            <!--android:id="@+id/btn1"-->
            <!--android:layout_alignParentTop="true"-->
            <!--android:layout_alignParentRight="true"-->
            <!--android:layout_alignParentEnd="true"-->
            <!--android:background="@drawable/share"/>-->

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            app:elevation="6dp"
            app:backgroundTint="@color/colorAccent"
            app:pressedTranslationZ="12dp"
            android:src="@drawable/ic_share_white_24dp" />

        <android.support.design.widget.FloatingActionButton

            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:elevation="6dp"
            app:backgroundTint="@color/colorAccent"
            app:pressedTranslationZ="12dp"
            android:layout_marginRight="10dp"
            android:layout_marginEnd="4dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:src="@drawable/ic_add_a_photo_white_24dp"
            android:id="@+id/fab1"/>

    </RelativeLayout>
</RelativeLayout>

最佳答案

在您的活动类中,使用如下自定义imageview:

public class DrawImageView extends LinearLayout {


    Paint paint = new Paint();
    Point point = new Point();
    Uri uri;
    Context myContext;

    public DrawImageView(Context context, Uri imageUri) {
        super(context);
        uri = imageUri;
        myContext = context;
        paint.setColor(Color.RED);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
        try {
            InputStream inputStream = context.getContentResolver().openInputStream(imageUri);
            this.setBackground(Drawable.createFromStream(inputStream, imageUri.toString()));
        } catch (FileNotFoundException ignored) {
        }

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawRect(point.x - 10, point.y - 10, point.x + 10, point.y + 10, paint);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                point.x = event.getX();
                point.y = event.getY();

        }
        invalidate();
        return true;

    }

    class Point {
        float x, y;
    }
}


这只是一个例子。在onDraw方法中实现您的逻辑。

10-05 23:33