Intereting Posts
Как применить стиль большого представления к уведомлению с помощью библиотеки Parse Запуск Android без GUI (безголовый Android) Как повторить HTTP-запросы с помощью OkHttp / Retrofit? Java.lang.NoClassDefFoundError: android.support.v7.appcompat.R $ стиль Как отфильтровать только соответствующие мультимедийные файлы в Android? Как сделать кнопочный щелчок и просмотреть элемент списка нажмите в настройке просмотра списка в android Как использовать SQLiteDatabase.CursorFactory Сжатие изображений, таких как Whatsapp и другие мессенджеры на Android Максимальный размер кеша Android KitKat (API 19) – Как писать сообщения в Content Content Provider без их отправки из приложения, отличного от приложения? Не удалось импортировать новый проект Gradle: не удалось найти версию Build Tools * .0.0 Как получить случайный цвет материала? Избегайте воссоздания одного и того же вида при переключении табуляции Как отправить csv / текстовый файл с телефона Android на принтер Wi-Fi? Android: уведомление от BroadcastReceiver

Рисование на холсте и сохранение изображения

Я новичок в классе Android Graphics. Я хочу нарисовать изображение (на самом деле вид подписи), используя события касания, и хочу, чтобы он был сохранен на SD-карте, когда я хочу его сохранить. Я просмотрел веб-страницы для любых таких учебных пособий, но я их не нашел. Кто-нибудь может рассказать мне, как рисовать на холсте, используя события касания и сохранить его.

Любые учебники или примеры кода будут очень полезны.

Solutions Collecting From Web of "Рисование на холсте и сохранение изображения"

Я видел действительно хороший код для разработчиков Android, но я больше не могу его найти … Это результат безрисковых кривых, поэтому он будет довольно плавным. Вот код, который я редактировал:

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

То в onCreate активности вы хотите использовать его в себе, просто напишите что-то вроде этого:

 RelativeLayout parent = (RelativeLayout) findViewById(R.id.signImageParent); myDrawView = new MyDrawView(this); parent.addView(myDrawView); 

Этот вид прозрачен и использует черную краску для рисования пальцем. Поэтому, если вы хотите увидеть, что вы рисуете, просто нарисуйте белую или серое растровое изображение на фоне этого представления (вы просто добавляете одну строку в начало onDraw), или можете использовать фон родителя.

Затем, когда вы хотите создать изображение из того, что вы нарисовали, вы просто вызываете

 parent.setDrawingCacheEnabled(true); Bitmap b = parent.getDrawingCache(); FileOutputStream fos = null; try { fos = new FileOutputStream(getFileName()); } catch (FileNotFoundException e) { e.printStackTrace(); } b.compress(CompressFormat.PNG, 95, fos); 

Это зависит от того, что вы хотите иметь в качестве вывода, вы можете использовать этот код или вместо родителя, вы можете сделать это с помощью myDrawView, и вы получите только изображение, которое вы нарисовали без фона (поскольку у нас есть прозрачный фон myDrawView).

Надеюсь, это поможет. Не стесняйтесь оставлять отзывы.

Рисунок

Scribbler.java:

 package org.yourpackage.scribble; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; public class Scribbler extends Activity { DrawView drawView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); drawView = new DrawView(this); drawView.setBackgroundColor(Color.WHITE); setContentView(drawView); drawView.requestFocus(); } } 

DrawView.java:

 package org.yourpackage.scribble; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; public class DrawView extends View implements OnTouchListener { List<Point> points = new ArrayList<Point>(); Paint paint = new Paint(); public DrawView(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); this.setOnTouchListener(this); paint.setColor(Color.BLACK); } @Override public void onDraw(Canvas canvas) { for (Point point : points) { canvas.drawCircle(point.x, point.y, 2, paint); } } public boolean onTouch(View view, MotionEvent event) { Point point = new Point(); point.x = event.getX(); point.y = event.getY(); points.add(point); invalidate(); return true; } } class Point { float x, y; } 

AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.yourpackage.scribble" android:versionCode="1" android:versionName="1.0"> <application> <activity android:name=".Scribbler"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest> ? <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.yourpackage.scribble" android:versionCode="1" android:versionName="1.0"> <application> <activity android:name=".Scribbler"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest> 

.. даст вам что-то вроде этого:

Alt text

Вы можете рисовать линии вместо пикселей

Спасательная вещь

Чтобы реализовать сохранение, вы можете передать Bitmap в конструктор Canvas , а затем использовать метод сжатия Bitmap для создания OutputStream который можно записать на SD-карту

EDIT, чтобы ответить на ваш комментарий:
Конечно, вы можете использовать XML для определения своего макета, так как DrawView extends View вы можете использовать его в вашем XML-файле макета. Пример файла макета main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/linearLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/gradient" > <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <org.yourpackage.scribble.DrawView android:id="@+id/drawView1" android:layout_width="wrap_content" android:layout_height="wrap_content"> </at.gru.android.drawdemo.DrawView> </LinearLayout> 

Что дает вам что-то вроде этого:
Введите описание изображения здесь
Вам просто нужен дополнительный контрструктор public DrawView(Context context, AttributeSet attrSet)