Как рисовать линию на изображении вместе с пальцем в android

В моем приложении я хочу нарисовать линию на изображении вместе с finger.I хочу, чтобы результат выглядел следующим образом: Введите описание изображения здесь

На этом экране рыба – это изображение, а красные линии – линии рисования. Поэтому я выполнил следующую ссылку, чтобы разработать приложение http://androidrises.blogspot.in/2012/10/draw-line-on-finger-touch.html. Это мой код:

public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.addphoto); btnAddPhoto=(Button)findViewById(R.id.add); btnEdit=(Button)findViewById(R.id.edit); imageView=(ImageView)findViewById(R.id.photo); btnAddPhoto.setOnClickListener(this); btnEdit.setOnClickListener(this); imageView.setOnTouchListener(this); } @Override public void onWindowFocusChanged(boolean hasFocus){ width=imageView.getWidth(); height=imageView.getHeight(); Log.e("heightttt",""+height); Log.e("Widthhhh",""+width); } @Override public void onClick(View v) { // TODO Auto-generated method stub if(v.equals(btnAddPhoto)){ popup.setVisibility(View.VISIBLE); } if(v.equals(btnEdit)){ bitmap = Bitmap.createBitmap((int) width, (int) height,Bitmap.Config.ARGB_8888); canvas = new Canvas(bitmap); paint = new Paint(); paint.setColor(Color.BLACK); imageView.setImageBitmap(bitmap); imageView.setOnTouchListener(this); } } public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: downx = event.getX(); downy = event.getY(); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: upx = event.getX(); upy = event.getY(); canvas.drawLine(downx, downy, upx, upy, paint); imageView.invalidate(); break; case MotionEvent.ACTION_CANCEL: break; default: break; } return true; } 

В этой кодировке всякий раз, когда я запускаю приложение, следующий экран будет открыт.

Введите описание изображения здесь

Затем, используя кнопку добавления, я добавил фотографию из своего gallary.This ниже экрана.

Введите описание изображения здесь

Затем всякий раз, когда я нажимаю кнопку edittool, изображение изображения рыбы исчезает, и я мог бы рисовать строки stright только следующим образом. Но я хочу рисовать линии на изображении вместе с пальцем, как первый экран.

Введите описание изображения здесь

Пожалуйста, кто-нибудь поможет мне. Я новичок в android.Thanks для любой помощи.

Вы должны переопределить метод onDraw вашего представления.

screen_drawing_room.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rlid" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout <!--set background for the bottom layout set image here. --> android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="bottom" android:orientation="vertical" android:weightSum="1.0" > <LinearLayout android:id="@+id/view_drawing_pad" <!--your drawing pad on foreground --> android:layout_width="fill_parent" android:layout_height="fill_parent" > </LinearLayout> </LinearLayout> </RelativeLayout 

В ваших действиях onCreate()

 DrawingView mDrawingView=new DrawingView(this); setContentView(R.layout.screen_drawing_room); LinearLayout mDrawingPad=(LinearLayout)findViewById(R.id.view_drawing_pad); mDrawingPad.addView(mDrawingView); 

DrawingView.java

Определите свой DrawingView. Нижеследующее может использоваться для рисования. Измените то же самое, чтобы нарисовать линии, тексты и цвет заливки (закрытая область). Для наводнения Заполните см. Принятый ответ в андроиде ссылок, используя алгоритм заливки заливки, исключающий из памяти исключение .

 class DrawingView extends View { Paint mPaint; //MaskFilter mEmboss; //MaskFilter mBlur; Bitmap mBitmap; Canvas mCanvas; Path mPath; Paint mBitmapPaint; public DrawingView(Context context) { super(context); // TODO Auto-generated constructor stub 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(20); mPath = new Path(); mBitmapPaint = new Paint(); mBitmapPaint.setColor(Color.RED); } @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 public void draw(Canvas canvas) { // TODO Auto-generated method stub super.draw(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); //mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN)); // kill this so we don't double draw mPath.reset(); // mPath= new Path(); } @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; } } 

Отобразится вид чертежа. Изучите fingerpaint.java из образца на sdk под графической папкой.

Результат. То, что вы видите в фоновом режиме, – это изображение. На переднем плане я рисую привет. Я рисую линии в угол. Если вы можете разобраться, он красный.

Нарисуйте линии, которые выглядят как граница. Установите ширину обводки для краски, как вам нравится. Аналогичным образом вы можете рисовать линии, если хотите, изменяя координаты x1, y1 и x2, y2.

 Display display = ( (Activity) mcontext).getWindowManager().getDefaultDisplay(); float w = display.getWidth(); float h = display.getHeight(); canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); canvas.drawLine(0, 0, w, 0,mBitmapPaint); canvas.drawLine(0, 0, 0, h,mBitmapPaint); canvas.drawLine(w,h,w,0,mBitmapPaint); canvas.drawLine(w, h, 0,h , mBitmapPaint); 

Введите описание изображения здесь

Редактировать:

Чтобы получить изображение из галереи

 File fp; Drawable d; public void setImagefrmGallery() { // 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()) { fp=file.getAbsolutePath(); d = Drawable.createFromPath(file.getAbsolutePath()); mDrawingPad.setBackgroundDrawable(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 [] proj={MediaStore.Images.Media.DATA}; Cursor cursor = managedQuery( contentUri, proj, // Which columns to return null, // WHERE clause; which rows to return (all rows) null, // WHERE clause selection arguments (none) null); // Order-by clause (ascending by name) int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } 
Intereting Posts
Как я могу поймать SIGSEGV (ошибка сегментации) и получить трассировку стека под JNI на Android? Подключитесь к эмулятору android для веб-службы localhost Начиная разрабатывать для Android, какие SDK (ы) я должен выбрать для установки? Пользовательские обязательные атрибуты Android Вызов класса обслуживания Один раз в день, когда приложение запускается в android, при меньшем потреблении батареи Создать папку в контексте инструментария Может jmockit и robolectric сосуществовать? Android android.permission.SEND_SMS не работает Обнаружение состояния приложения возобновления из разных навигационных состояний Android Обновление маркера карт Google из передатчика sms-приемника Установить значение для объекта области Android. Почему использование интерфейса считается лучшей практикой общения между Activity и Fragment? Можно ли добавить несколько Асинхронных задач и выполнить одновременно? Проверка лицензии Google внезапно не срабатывает на устройстве разработки Как я могу вызвать getContentResolver в android?