在Android imageView上绘制应用程序

全球战士

我有一个使用图库图片填充的imageview。现在,在加载图像之后,我希望用户能够在图像上绘制图像。如何做到这一点?我是android的新手,任何指针都会有所帮助。谢谢

拉贡南丹

使用fingerpaint api并将图像设置为customview的背景并进行绘制。

获得图像的路径之后。

    customview.setBackground(yourdrawable);

您可以使用菜单按钮选择选项。选择图库以从图库中获取图像并将其设置为视图的背景。

您可以使用颜色选择器选择绘图的颜色。

完整样本

public class MainActivity extends Activity
        implements ColorPickerDialog.OnColorChangedListener {

    MyView mv;
    Drawable d;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mv = new MyView(this);
        setContentView(mv);

        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(0xFFFF0000);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);

        mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 },
                                       0.4f, 6, 3.5f);

        mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
    }

    private Paint       mPaint;
    private MaskFilter  mEmboss;
    private MaskFilter  mBlur;

    public void colorChanged(int color) {
        mPaint.setColor(color);
    }

    public class MyView extends View {

        private static final float MINP = 0.25f;
        private static final float MAXP = 0.75f;

        private Bitmap  mBitmap;
        private Canvas  mCanvas;
        private Path    mPath,circlePath;
        private Paint   mBitmapPaint,circlePaint;

        public MyView(Context c) {
            super(c);
            circlePaint = new Paint();
            circlePath = new Path();
            circlePaint.setAntiAlias(true);
            circlePaint.setColor(Color.BLUE);
            circlePaint.setStyle(Paint.Style.STROKE);
            circlePaint.setStrokeJoin(Paint.Join.MITER);
            circlePaint.setStrokeWidth(4f); 

            mPath = new Path();
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
        }

        @Override
        protected void onDraw(Canvas canvas) {


           canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

            canvas.drawPath(mPath, mPaint);
            canvas.drawPath(circlePath, circlePaint);
        }

        private float mX, mY;
        private static final float TOUCH_TOLERANCE = 4;

        private void touch_start(float x, float y) {
            mPath.reset();
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
        }
        private void touch_move(float x, float y) {
            float dx = Math.abs(x - mX);
            float dy = Math.abs(y - mY);
            if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
                mX = x;
                mY = y;
            }
            circlePath.reset();
            circlePath.addCircle(mX, mY, 30, Path.Direction.CW);
        }
        private void touch_up() {
            mPath.lineTo(mX, mY);
            // commit the path to our offscreen
            mCanvas.drawPath(mPath, mPaint);
            // kill this so we don't double draw
            circlePath.reset();
            mPath.reset();
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX();
            float y = event.getY();

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    touch_start(x, y);
                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    touch_move(x, y);
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    touch_up();
                    invalidate();
                    break;
            }
            return true;
        }
    }

    private static final int COLOR_MENU_ID = Menu.FIRST;
    private static final int EMBOSS_MENU_ID = Menu.FIRST + 1;
    private static final int BLUR_MENU_ID = Menu.FIRST + 2;
    private static final int ERASE_MENU_ID = Menu.FIRST + 3;
    private static final int SRCATOP_MENU_ID = Menu.FIRST + 4;
    private static final int Image_gallery= Menu.FIRST + 5;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(0, COLOR_MENU_ID, 0, "Color").setShortcut('3', 'c');
        menu.add(0, EMBOSS_MENU_ID, 0, "Emboss").setShortcut('4', 's');
        menu.add(0, BLUR_MENU_ID, 0, "Blur").setShortcut('5', 'z');
        menu.add(0, ERASE_MENU_ID, 0, "Erase").setShortcut('5', 'z');
        menu.add(0, SRCATOP_MENU_ID, 0, "SrcATop").setShortcut('5', 'z');
        menu.add(0, Image_gallery, 0, "Gallery").setShortcut('5', 'z');
        /****   Is this the mechanism to extend with filter effects?
        Intent intent = new Intent(null, getIntent().getData());
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
        menu.addIntentOptions(
                              Menu.ALTERNATIVE, 0,
                              new ComponentName(this, NotesList.class),
                              null, intent, 0, null);
        *****/
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        mPaint.setXfermode(null);
        mPaint.setAlpha(0xFF);

        switch (item.getItemId()) {
            case COLOR_MENU_ID:
                new ColorPickerDialog(this, this, mPaint.getColor()).show();
                return true;
            case EMBOSS_MENU_ID:
                if (mPaint.getMaskFilter() != mEmboss) {
                    mPaint.setMaskFilter(mEmboss);
                } else {
                    mPaint.setMaskFilter(null);
                }
                return true;
            case BLUR_MENU_ID:
                if (mPaint.getMaskFilter() != mBlur) {
                    mPaint.setMaskFilter(mBlur);
                } else {
                    mPaint.setMaskFilter(null);
                }
                return true;
            case ERASE_MENU_ID:
                mPaint.setXfermode(new PorterDuffXfermode(
                                                        PorterDuff.Mode.CLEAR));
                return true;
            case SRCATOP_MENU_ID:
                mPaint.setXfermode(new PorterDuffXfermode(
                                                    PorterDuff.Mode.SRC_ATOP));
                mPaint.setAlpha(0x80);
                return true;
            case Image_gallery:
                setDrawingThemefrmGallery();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
    public void  setDrawingThemefrmGallery()
    {
        // To open up a gallery browser
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"),1);
        // To handle when an image is selected from the browser, add the following to your Activity
    }
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
        if (requestCode == 1) {
        // currImageURI is the global variable I�m using to hold the content:// URI of the image
        Uri currImageURI = data.getData();
        System.out.println("Hello======="+getRealPathFromURI(currImageURI));
        String s= getRealPathFromURI(currImageURI);
        File file = new File(s);

        if (file.exists()) {
        d = Drawable.createFromPath(file.getAbsolutePath());
        //mv.setBackgroundDrawable(d);
         mv.setBackground(d);
        }
        else
        {
            System.out.println("File Not Found");
        }



        }
        }
        }
        // And to convert the image URI to the direct file system path of the image file
        public String getRealPathFromURI(Uri contentUri) {
        // can post image

         String[] filePathColumn = { MediaStore.Images.Media.DATA };


         Cursor cursor = getContentResolver().query(contentUri,
                 filePathColumn, null, null, null);
         cursor.moveToFirst();
         int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
         String picturePath = cursor.getString(columnIndex);
         return  picturePath ;


    }
}

ColorPickerDialog

public class ColorPickerDialog extends Dialog {

    public interface OnColorChangedListener {
        void colorChanged(int color);
    }

    private OnColorChangedListener mListener;
    private int mInitialColor;

    private static class ColorPickerView extends View {
        private Paint mPaint;
        private Paint mCenterPaint;
        private final int[] mColors;
        private OnColorChangedListener mListener;

        ColorPickerView(Context c, OnColorChangedListener l, int color) {
            super(c);
            mListener = l;
            mColors = new int[] {
                0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
                0xFFFFFF00, 0xFFFF0000
            };
            Shader s = new SweepGradient(0, 0, mColors, null);

            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(s);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(32);

            mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mCenterPaint.setColor(color);
            mCenterPaint.setStrokeWidth(5);
        }

        private boolean mTrackingCenter;
        private boolean mHighlightCenter;

        @Override
        protected void onDraw(Canvas canvas) {
            float r = CENTER_X - mPaint.getStrokeWidth()*0.5f;

            canvas.translate(CENTER_X, CENTER_X);

            canvas.drawOval(new RectF(-r, -r, r, r), mPaint);
            canvas.drawCircle(0, 0, CENTER_RADIUS, mCenterPaint);

            if (mTrackingCenter) {
                int c = mCenterPaint.getColor();
                mCenterPaint.setStyle(Paint.Style.STROKE);

                if (mHighlightCenter) {
                    mCenterPaint.setAlpha(0xFF);
                } else {
                    mCenterPaint.setAlpha(0x80);
                }
                canvas.drawCircle(0, 0,
                                  CENTER_RADIUS + mCenterPaint.getStrokeWidth(),
                                  mCenterPaint);

                mCenterPaint.setStyle(Paint.Style.FILL);
                mCenterPaint.setColor(c);
            }
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            setMeasuredDimension(CENTER_X*2, CENTER_Y*2);
        }

        private static final int CENTER_X = 100;
        private static final int CENTER_Y = 100;
        private static final int CENTER_RADIUS = 32;

        private int floatToByte(float x) {
            int n = java.lang.Math.round(x);
            return n;
        }
        private int pinToByte(int n) {
            if (n < 0) {
                n = 0;
            } else if (n > 255) {
                n = 255;
            }
            return n;
        }

        private int ave(int s, int d, float p) {
            return s + java.lang.Math.round(p * (d - s));
        }

        private int interpColor(int colors[], float unit) {
            if (unit <= 0) {
                return colors[0];
            }
            if (unit >= 1) {
                return colors[colors.length - 1];
            }

            float p = unit * (colors.length - 1);
            int i = (int)p;
            p -= i;

            // now p is just the fractional part [0...1) and i is the index
            int c0 = colors[i];
            int c1 = colors[i+1];
            int a = ave(Color.alpha(c0), Color.alpha(c1), p);
            int r = ave(Color.red(c0), Color.red(c1), p);
            int g = ave(Color.green(c0), Color.green(c1), p);
            int b = ave(Color.blue(c0), Color.blue(c1), p);

            return Color.argb(a, r, g, b);
        }

        private int rotateColor(int color, float rad) {
            float deg = rad * 180 / 3.1415927f;
            int r = Color.red(color);
            int g = Color.green(color);
            int b = Color.blue(color);

            ColorMatrix cm = new ColorMatrix();
            ColorMatrix tmp = new ColorMatrix();

            cm.setRGB2YUV();
            tmp.setRotate(0, deg);
            cm.postConcat(tmp);
            tmp.setYUV2RGB();
            cm.postConcat(tmp);

            final float[] a = cm.getArray();

            int ir = floatToByte(a[0] * r +  a[1] * g +  a[2] * b);
            int ig = floatToByte(a[5] * r +  a[6] * g +  a[7] * b);
            int ib = floatToByte(a[10] * r + a[11] * g + a[12] * b);

            return Color.argb(Color.alpha(color), pinToByte(ir),
                              pinToByte(ig), pinToByte(ib));
        }

        private static final float PI = 3.1415926f;

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX() - CENTER_X;
            float y = event.getY() - CENTER_Y;
            boolean inCenter = java.lang.Math.sqrt(x*x + y*y) <= CENTER_RADIUS;

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mTrackingCenter = inCenter;
                    if (inCenter) {
                        mHighlightCenter = true;
                        invalidate();
                        break;
                    }
                case MotionEvent.ACTION_MOVE:
                    if (mTrackingCenter) {
                        if (mHighlightCenter != inCenter) {
                            mHighlightCenter = inCenter;
                            invalidate();
                        }
                    } else {
                        float angle = (float)java.lang.Math.atan2(y, x);
                        // need to turn angle [-PI ... PI] into unit [0....1]
                        float unit = angle/(2*PI);
                        if (unit < 0) {
                            unit += 1;
                        }
                        mCenterPaint.setColor(interpColor(mColors, unit));
                        invalidate();
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    if (mTrackingCenter) {
                        if (inCenter) {
                            mListener.colorChanged(mCenterPaint.getColor());
                        }
                        mTrackingCenter = false;    // so we draw w/o halo
                        invalidate();
                    }
                    break;
            }
            return true;
        }
    }

    public ColorPickerDialog(Context context,
                             OnColorChangedListener listener,
                             int initialColor) {
        super(context);

        mListener = listener;
        mInitialColor = initialColor;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        OnColorChangedListener l = new OnColorChangedListener() {
            public void colorChanged(int color) {
                mListener.colorChanged(color);
                dismiss();
            }
        };

        setContentView(new ColorPickerView(getContext(), l, mInitialColor));
        setTitle("Pick a Color");
    }
}

完成抽奖后,您还可以保存抽奖。

快照

在此处输入图片说明 编辑

您还可以扩展ImageView并覆盖onDraw和绘制图像。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用android imageview应用程序在可绘制文件夹中打开图像?

来自分类Dev

涟漪可绘制工具使Android API 19上的应用程序崩溃

来自分类Dev

Android应用程序在setText上崩溃

来自分类Dev

意图在Android上隐藏应用程序

来自分类Dev

在Android上覆盖应用程序的DNS

来自分类Dev

设备上的Android应用程序

来自分类Dev

Android上的TabHost使应用程序崩溃

来自分类Dev

Android应用程序在setOnItemSelectedListener上崩溃

来自分类Dev

Kivy应用程序在Android上崩溃

来自分类Dev

Windows Phone上的Android应用程序

来自分类Dev

在Android中绘制其他应用程序

来自分类Dev

在Android应用程序中更改可绘制(PNG)

来自分类Dev

绘制Android中的其他应用程序

来自分类Dev

为什么当我将图像设置为 ImageView 并在 android 7.1.1 上运行它时应用程序崩溃

来自分类Dev

Android:在Android应用程序上使用图像

来自分类Dev

Phonegap Android应用程序无法在Android KitKat上运行

来自分类Dev

Android缩放,拖动,在ImageView上绘制

来自分类Dev

返回启动器应用程序:: Android上的应用程序时保持状态?

来自分类Dev

如何在Android Studio中终止应用程序-在单独的设备上运行的应用程序

来自分类常见问题

系统应用程序与Android上的特权应用程序有什么区别?

来自分类Dev

Facebook Android应用程序安装未显示在应用程序仪表板上

来自分类Dev

Android上的浮动应用程序(窗口化应用程序)

来自分类Dev

如何在主屏幕上的娱乐应用程序中列出Android TV应用程序?

来自分类Dev

如何在Android 10上使用应用程序内更新来更新应用程序

来自分类Dev

Facebook Android应用程序安装未显示在应用程序仪表板上

来自分类Dev

Android上的浮动应用程序(窗口化应用程序)

来自分类Dev

将应用程序仅用作Android设备上的应用程序

来自分类Dev

如何在主屏幕上的娱乐应用程序中列出Android TV应用程序?

来自分类Dev

如何在Android上为整个应用程序制作底部应用程序栏?

Related 相关文章

  1. 1

    如何使用android imageview应用程序在可绘制文件夹中打开图像?

  2. 2

    涟漪可绘制工具使Android API 19上的应用程序崩溃

  3. 3

    Android应用程序在setText上崩溃

  4. 4

    意图在Android上隐藏应用程序

  5. 5

    在Android上覆盖应用程序的DNS

  6. 6

    设备上的Android应用程序

  7. 7

    Android上的TabHost使应用程序崩溃

  8. 8

    Android应用程序在setOnItemSelectedListener上崩溃

  9. 9

    Kivy应用程序在Android上崩溃

  10. 10

    Windows Phone上的Android应用程序

  11. 11

    在Android中绘制其他应用程序

  12. 12

    在Android应用程序中更改可绘制(PNG)

  13. 13

    绘制Android中的其他应用程序

  14. 14

    为什么当我将图像设置为 ImageView 并在 android 7.1.1 上运行它时应用程序崩溃

  15. 15

    Android:在Android应用程序上使用图像

  16. 16

    Phonegap Android应用程序无法在Android KitKat上运行

  17. 17

    Android缩放,拖动,在ImageView上绘制

  18. 18

    返回启动器应用程序:: Android上的应用程序时保持状态?

  19. 19

    如何在Android Studio中终止应用程序-在单独的设备上运行的应用程序

  20. 20

    系统应用程序与Android上的特权应用程序有什么区别?

  21. 21

    Facebook Android应用程序安装未显示在应用程序仪表板上

  22. 22

    Android上的浮动应用程序(窗口化应用程序)

  23. 23

    如何在主屏幕上的娱乐应用程序中列出Android TV应用程序?

  24. 24

    如何在Android 10上使用应用程序内更新来更新应用程序

  25. 25

    Facebook Android应用程序安装未显示在应用程序仪表板上

  26. 26

    Android上的浮动应用程序(窗口化应用程序)

  27. 27

    将应用程序仅用作Android设备上的应用程序

  28. 28

    如何在主屏幕上的娱乐应用程序中列出Android TV应用程序?

  29. 29

    如何在Android上为整个应用程序制作底部应用程序栏?

热门标签

归档