两项活动之间传递位图 [英] Passing Bitmap between two activities

查看:99
本文介绍了两项活动之间传递位图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开发一个应用程序的绘画中,我想从一个活动传递一个位图图像到另一个,但项目没有响应。我转换相对布局截图成位图,并通过意图传递给它,但问题并没有解决。这是我的code ....

DrawingActivity

 包com.newdrawing;
公共类DrawingActivity延伸活动{
    私人位图mBitmap;
    私人帆布mCanvas;
    私人路径的mpath;
    私人油漆mBitmapPaint;
    私人油漆mPaint;
    MyDrawView myDrawView;
    RelativeLayout的父母;
    点阵位图;
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_drawing);

        父=(RelativeLayout的)findViewById(R.id.singleparent);
        myDrawView =新MyDrawView(本);
        parent.addView(myDrawView);
        活动范围内;
        // RelativeLayout的项目=(RelativeLayout的)findViewById(R.id.item);
        查看孩子= getLayoutInflater()膨胀(R.layout.trans,空)。
        parent.addView(子);
   }

   公共无效颜色(视图v){
       开关(v.getId()){
        案例R.id.button3:
           parent.setBackgroundColor(Color.RED);
            打破;
        案例R.id.button4:
             parent.setBackgroundColor(Color.GREEN);
            打破;
        案例R.id.button5:
             parent.setBackgroundColor(Color.BLUE);
            打破;
        }
    }
    公共无效保存(视图v){
     parent.setDrawingCacheEnabled(真正的);
     位图= parent.getDrawingCache();
     parent.setDrawingCacheEnabled(假);
       Log.e(位图,将String.valueOf(位图));

    // 发送();

    //帆布C =新的Canvas(位);
    //.draw(c);
    //文件OUTPUTFILE; //保存位置
     // FileOutputStream中出=新的FileOutputStream(镜像文件);
    //布尔型成功= bitmap.com preSS(比较pressFormat.PNG,100,出);
    // out.close();

    意图I =新的意图(这一点,ImageActivity.class);
       ByteArrayOutputStream BS =新ByteArrayOutputStream();
     bitmap.com preSS(Bitmap.Com pressFormat.PNG,50,BS);
     字节[]的字节数组= bs.toByteArray();
     i.putExtra(的字节数组,字节);
     startActivity(ⅰ);
 }

 私人无效的send()
 {
    意图I9 =新的意图(DrawingActivity.this,ImageActivity.class);
    i9.putExtra(图像,位图);
    startActivity(I9);
 }

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        。getMenuInflater()膨胀(R.menu.activity_drawing,菜单);
        返回true;
    }
    公共类MyDrawView扩展视图{

        公共MyDrawView(上下文C){
            超级(C);

            的mpath =新路径();
            mBitmapPaint =新的油漆(Paint.DITHER_FLAG);

            mPaint =新的油漆();
            mPaint.setAntiAlias​​(真正的);
            mPaint.setDither(真正的);
            mPaint.setColor(0xFF000000);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeJoin(Paint.Join.ROUND);
            mPaint.setStrokeCap​​(Paint.Cap.ROUND);
            mPaint.setStrokeWidth(3);
        }

        @覆盖
        保护无效onSizeChanged(INT W,INT小时,INT oldw,诠释oldh){
            super.onSizeChanged(W,H,oldw,oldh);
            mBitmap = Bitmap.createBitmap(W,H,Bitmap.Config.ARGB_8888);
            mCanvas =新的Canvas(mBitmap);
        }

        @覆盖
        保护无效的OnDraw(帆布油画){
            canvas.drawBitmap(mBitmap,0,0,mBitmapPaint);
            canvas.drawColor(Color.TRANSPARENT);

            canvas.drawPath(的mpath,mPaint);
        }

        私人浮动MX,我的;
        私有静态最终浮动TOUCH_TOLERANCE = 4;

        私人无效touch_start(浮X,浮动Y){
            mPath.reset();
            mPath.moveTo(X,Y);
            MX = X;
            我= Y;
        }
        私人无效TOUCH_MOVE(浮X,浮动Y){
            浮DX = Math.abs(X  -  MX);
            浮DY = Math.abs(Y  - 我的);
            如果(DX> = TOUCH_TOLERANCE || DY> = TOUCH_TOLERANCE){
                mPath.quadTo(MX,MY,(X + MX)/ 2,(Y +我)/ 2);
                MX = X;
                我= Y;
            }
        }
        私人无效touch_up(){
            mPath.lineTo(MX,MY);
            //提交路径,我们的屏幕外
            mCanvas.drawPath(的mpath,mPaint);
            //杀了这个,所以我们不重复抽奖
            mPath.reset();
        }

        @覆盖
        公共布尔的onTouchEvent(MotionEvent事件){
            浮X = event.getX();
            浮动Y = event.getY();

            开关(event.getAction()){
                案例MotionEvent.ACTION_DOWN:
                    touch_start(X,Y​​);
                    无效();
                    打破;
                案例MotionEvent.ACTION_MOVE:
                    TOUCH_MOVE(X,Y);
                    无效();
                    打破;
                案例MotionEvent.ACTION_UP:
                    润色();
                    无效();
                    打破;
            }
            返回true;
        }

        公共无效清除(){
            mBitmap.eraseColor(Color.TRANSPARENT);
            无效();
            System.gc()的;
        }
    }
}
 

ImageActivity

 包com.newdrawing;
公共类ImageActivity延伸活动{

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_image);
        意图I = getIntent();

        ImageView的IMG =(ImageView的)findViewById(R.id.image11);
     / *
       如果(getIntent()。hasExtra(的字节数组))
       {

           位图B = BitmapFactory.de codeByteArray(
                。getIntent()getByteArrayExtra(的字节数组),0,getIntent()getByteArrayExtra(的字节数组)的长度)。;
          img.setImageBitmap(B);
           Log.e(位图,将String.valueOf(b))的;

       } * /

       捆绑额外= getIntent()getExtras()。
       字节[]的字节数组= extras.getByteArray(的字节数组);

       BMP位= BitmapFactory.de codeByteArray(字节数组,0,byteArray.length);
       img.setImageBitmap(BMP);
    }

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        。getMenuInflater()膨胀(R.menu.activity_image,菜单);
        返回true;
    }
 }
 

要价较高报告

  10月10日至16号:39:22.653:E / AndroidRuntime(339):致命异常:主要
10月10号至16日:39:22.653:E / AndroidRuntime(339):java.lang.IllegalStateException:无法执行活动的方法
10月10号至16日:39:22.653:E / AndroidRuntime(339):在android.view.View $ 1.onClick(View.java:2072)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在android.view.View.performClick(View.java:2408)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在android.view.View $ PerformClick.run(View.java:8816)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在android.os.Handler.handleCallback(Handler.java:587)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在android.os.Handler.dispatchMessage(Handler.java:92)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在android.os.Looper.loop(Looper.java:123)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在android.app.ActivityThread.main(ActivityThread.java:4627)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在java.lang.reflect.Method.invokeNative(本机方法)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在java.lang.reflect.Method.invoke(Method.java:521)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在dalvik.system.NativeStart.main(本机方法)
10月10号至16日:39:22.653:E / AndroidRuntime(339):由:java.lang.reflect.InvocationTargetException
10月10号至16日:39:22.653:E / AndroidRuntime(339):在com.newdrawing.DrawingActivity.save(DrawingActivity.java:91)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在java.lang.reflect.Method.invokeNative(本机方法)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在java.lang.reflect.Method.invoke(Method.java:521)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在android.view.View $ 1.onClick(View.java:2067)
10月10号至16日:39:22.653:E / AndroidRuntime(339):11 ...更多
10月10号至16日:39:22.653:E / AndroidRuntime(339):java.lang.IllegalStateException:产生的原因无法COM preSS再循环的位图
10月10号至16日:39:22.653:E / AndroidRuntime(339):在android.graphics.Bitmap.checkRecycled(Bitmap.java:180)
10月10号至16日:39:22.653:E / AndroidRuntime(339):在android.graphics.Bitmap.com preSS(Bitmap.java:572)
10月10号至16日:39:22.653:E / AndroidRuntime(339):15 ...更多
 

解决方案

您可以简单地尝试下面 -

 意向书我=新的意图(这一点,Second.class)
i.putExtra(图像,位图);
startActivity㈠
 

和,在 Second.class

 位图位=(位图)intent.getParcelableExtra(图像);
 

有一个在这里 如果你想COM preSS你的位图发送到下一个活动之前,只要看看下面 -

 意向书我=新的意图(这一点,NextActivity.class);
位图B: //位图
ByteArrayOutputStream BS =新ByteArrayOutputStream();
b.com preSS(Bitmap.Com pressFormat.PNG,50,BS);
i.putExtra(的字节数组,bs.toByteArray());
startActivity(ⅰ);
 

在你的nextactivity -

 如果(getIntent()。hasExtra(的字节数组)){
ImageView的previewThumbnail =新ImageView的(这一点);
位图B = BitmapFactory.de codeByteArray(
    。getIntent()getByteArrayExtra(的字节数组),0,getIntent()getByteArrayExtra(的字节数组)的长度)。;
previewThumbnail.setImageBitmap(B);
}
 

I am developing a painting app in which i want to pass a Bitmap image from one activity to another but the project is not responding. I converted the relative layout screenshot into a bitmap and passing it through Intent but the problem is not solved. Here is my code....

DrawingActivity

package com.newdrawing;
public class DrawingActivity extends Activity {
    private Bitmap  mBitmap;
    private Canvas  mCanvas;
    private Path    mPath;
    private Paint   mBitmapPaint;
    private Paint   mPaint;
    MyDrawView myDrawView;
    RelativeLayout parent;
    Bitmap bitmap;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drawing);

        parent = (RelativeLayout) findViewById(R.id.singleparent);
        myDrawView = new MyDrawView(this);
        parent.addView(myDrawView);
        Activity context;
        //RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
        View child = getLayoutInflater().inflate(R.layout.trans, null);
        parent.addView(child);   
   }

   public void color(View v) {
       switch (v.getId()) {
        case R.id.button3:
           parent.setBackgroundColor(Color.RED);
            break;
        case R.id.button4:
             parent.setBackgroundColor(Color.GREEN);
            break;
        case R.id.button5:
             parent.setBackgroundColor(Color.BLUE);
            break;
        }
    }
    public void save(View v) {
     parent.setDrawingCacheEnabled(true);
     bitmap=parent.getDrawingCache();
     parent.setDrawingCacheEnabled(false);
       Log.e("Bitmap",String.valueOf(bitmap));

    // send();

    //Canvas c = new Canvas(bitmap);
    //.draw(c);
    // File outputFile; // Where to save it
     //FileOutputStream out = new FileOutputStream(imageFile);
    // boolean success = bitmap.compress(CompressFormat.PNG, 100, out);
    // out.close();

    Intent i = new Intent(this, ImageActivity.class);
       ByteArrayOutputStream bs = new ByteArrayOutputStream();
     bitmap.compress(Bitmap.CompressFormat.PNG, 50, bs);
     byte[] byteArray = bs.toByteArray();
     i.putExtra("byteArray", byteArray);
     startActivity(i);
 }

 private void send()
 {
    Intent i9=new Intent(DrawingActivity.this,ImageActivity.class);
    i9.putExtra("Image",bitmap);
    startActivity(i9);
 }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_drawing, menu);
        return true;
    }
    public class MyDrawView extends View {

        public MyDrawView(Context c) {
            super(c);

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

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

        @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.drawColor(Color.TRANSPARENT);

            canvas.drawPath(mPath, mPaint);
        }

        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;
            }
        }
        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
            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;
        }

        public void clear(){
            mBitmap.eraseColor(Color.TRANSPARENT);
            invalidate();
            System.gc();
        }
    }
}

ImageActivity

package com.newdrawing;
public class ImageActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image);
        Intent i =  getIntent();

        ImageView img=(ImageView)findViewById(R.id.image11);
     /*
       if(getIntent().hasExtra("byteArray")) 
       {

           Bitmap b = BitmapFactory.decodeByteArray(
                getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length);        
          img.setImageBitmap(b);
           Log.e("Bitmap",String.valueOf(b));

       }*/

       Bundle extras = getIntent().getExtras();
       byte[] byteArray = extras.getByteArray("byteArray");

       Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
       img.setImageBitmap(bmp);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_image, menu);
        return true;
    }
 }

Locat Report

10-16 10:39:22.653: E/AndroidRuntime(339): FATAL EXCEPTION: main
10-16 10:39:22.653: E/AndroidRuntime(339): java.lang.IllegalStateException: Could not execute method of the activity
10-16 10:39:22.653: E/AndroidRuntime(339):  at android.view.View$1.onClick(View.java:2072)
10-16 10:39:22.653: E/AndroidRuntime(339):  at android.view.View.performClick(View.java:2408)
10-16 10:39:22.653: E/AndroidRuntime(339):  at android.view.View$PerformClick.run(View.java:8816)
10-16 10:39:22.653: E/AndroidRuntime(339):  at android.os.Handler.handleCallback(Handler.java:587)
10-16 10:39:22.653: E/AndroidRuntime(339):  at android.os.Handler.dispatchMessage(Handler.java:92)
10-16 10:39:22.653: E/AndroidRuntime(339):  at android.os.Looper.loop(Looper.java:123)
10-16 10:39:22.653: E/AndroidRuntime(339):  at android.app.ActivityThread.main(ActivityThread.java:4627)
10-16 10:39:22.653: E/AndroidRuntime(339):  at java.lang.reflect.Method.invokeNative(Native Method)
10-16 10:39:22.653: E/AndroidRuntime(339):  at java.lang.reflect.Method.invoke(Method.java:521)
10-16 10:39:22.653: E/AndroidRuntime(339):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-16 10:39:22.653: E/AndroidRuntime(339):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-16 10:39:22.653: E/AndroidRuntime(339):  at dalvik.system.NativeStart.main(Native Method)
10-16 10:39:22.653: E/AndroidRuntime(339): Caused by: java.lang.reflect.InvocationTargetException
10-16 10:39:22.653: E/AndroidRuntime(339):  at com.newdrawing.DrawingActivity.save(DrawingActivity.java:91)
10-16 10:39:22.653: E/AndroidRuntime(339):  at java.lang.reflect.Method.invokeNative(Native Method)
10-16 10:39:22.653: E/AndroidRuntime(339):  at java.lang.reflect.Method.invoke(Method.java:521)
10-16 10:39:22.653: E/AndroidRuntime(339):  at android.view.View$1.onClick(View.java:2067)
10-16 10:39:22.653: E/AndroidRuntime(339):  ... 11 more
10-16 10:39:22.653: E/AndroidRuntime(339): Caused by: java.lang.IllegalStateException: Can't compress a recycled bitmap
10-16 10:39:22.653: E/AndroidRuntime(339):  at android.graphics.Bitmap.checkRecycled(Bitmap.java:180)
10-16 10:39:22.653: E/AndroidRuntime(339):  at android.graphics.Bitmap.compress(Bitmap.java:572)
10-16 10:39:22.653: E/AndroidRuntime(339):  ... 15 more

解决方案

You can simply try with below -

Intent i = new Intent(this, Second.class)
i.putExtra("Image", bitmap);
startActivity(i)

And, in Second.class

Bitmap bitmap = (Bitmap) intent.getParcelableExtra("Image");

Have a look at here If you want to compress your Bitmap before sending to next activity just have a look at below -

Intent i = new Intent(this, NextActivity.class);
Bitmap b; // your bitmap
ByteArrayOutputStream bs = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 50, bs);
i.putExtra("byteArray", bs.toByteArray());
startActivity(i);

in your nextactivity -

if(getIntent().hasExtra("byteArray")) {
ImageView previewThumbnail = new ImageView(this);
Bitmap b = BitmapFactory.decodeByteArray(
    getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length);        
previewThumbnail.setImageBitmap(b);
}

这篇关于两项活动之间传递位图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆