Wątek przeniesiony 2019-06-26 22:23 z przez Ktos.

Jak zapisać obrazek utworzony w Canvas za pomocą metody onClick?

Odpowiedz Nowy wątek
2019-06-26 21:59
0

Tworzę apke pokroju Painta w Android Studio. Chciałbym aby po naciśnięciu przycisku obraz został zapisany do galerii urządzenia. Niestety moja metoda onClick nie działa tak jak należy, kiedy naciskam przycisk obraz się nie zapisuje...

Mój kod:

public class MainActivity extends AppCompatActivity {

    Button save;

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

        save = findViewById(R.id.save);

        final RelativeLayout canva = (RelativeLayout) findViewById(R.id.r1);
        MyDrawView myDrawView = new MyDrawView(this);
        canva.addView(myDrawView);

        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                canva.setDrawingCacheEnabled(true);
                String imsSaved = MediaStore.Images.Media.insertImage(getContentResolver(),
                        canva.getDrawingCache(), UUID.randomUUID().toString()+".png","drawing");
                if (imsSaved!=null){
                    Toast savedtoast = Toast.makeText(getApplicationContext(),"Saved", Toast.LENGTH_LONG);
                    savedtoast.show();
                }else{
                    Toast unsavedtoast = Toast.makeText(getApplicationContext(),"Error", Toast.LENGTH_LONG);
                    unsavedtoast.show();
                }
                canva.destroyDrawingCache();
            }
        });

    }
}
public class MyDrawView extends View {

    private Bitmap mBitmap;
    private Canvas mCanvas;
    private Path mPath;
    private Paint mBitmapPaint;
    private Paint   mPaint;

    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(6);
    }

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

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

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <RelativeLayout
        android:id="@+id/r1"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

    </RelativeLayout>

    <Button
        android:id="@+id/save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:text="save"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
edytowany 1x, ostatnio: user656, 2019-06-26 22:00

Pozostało 580 znaków

2019-06-27 18:42
0

Czy dałeś zezwolenie na zapis w pliku AndroidManifest.xml?

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Tak, jak najbardziej. Lecz pomimo tego i tak nie działa :/ - user656 2019-06-27 19:59
W nowszych wersjach androida od 6.0 w górę oprócz wpisu do manifestu obowiązują też Request App Permissions. Wyświetlane jest okienko Czy zezwolić aplikacji takiej a takiej dostęp do tego a tego Jeżeli tego nie zaimplementujesz to apka mimo wpisu w manifeście nie uzyska uprawnień. Link-> https://developer.android.com/training/permissions/requesting - au7h 2019-06-29 23:47

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0