内容简介:翻译自:https://stackoverflow.com/questions/15704205/how-to-draw-line-on-imageview-along-with-finger-in-android
在我的应用程序中,我想在fingerview上绘制线条和finger.我想要输出如下:
在这个屏幕上,fish是imageview,红线是绘制线条.所以我按照下面的链接来开发应用程序
http://androidrises.blogspot.in/2012/10/draw-line-on-finger-touch.html.This 是我的代码:
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的照片.这是波纹管屏幕.
然后,每当我点击edittool按钮时,鱼图像视图就会消失,我可以像下面那样绘制直线.但我想在第一个屏幕上用手指画出想象线上的线条.
请任何人帮助我.我是android的新手.谢谢你的帮助.
您应该覆盖视图的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.以下可用于徒手画.修改相同以绘制线条,文本和填充颜色(封闭区域).对于洪水填充,请参阅链接 android using flood fill algorithm getting out of memory exception 中的已接受答案.
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; } }
您的“绘图”视图已设置.研究图形文件夹下sdk上样本的fingerpaint.java.
结果是打火机.你在后台看到的是一张图片.在前景我画画.我在角落画线.如果你能说出它是红色的.
画出看起来像边框的线条.将油漆的描边宽度设置为您喜欢的任何颜色.类似地,您可以通过更改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); }
翻译自:https://stackoverflow.com/questions/15704205/how-to-draw-line-on-imageview-along-with-finger-in-android
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 在Markdown中用mermaid语法绘制图表
- R中用线性回归进行预测建模
- iOS面试题·项目中用过 Runtime 吗?
- 在docker中用Tomcat运行web项目
- 在项目实践中用更优雅的方式处理数组问题
- ajax中用josnp接收josn数据的实现方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Language Implementation Patterns
Terence Parr / Pragmatic Bookshelf / 2010-1-10 / USD 34.95
Knowing how to create domain-specific languages (DSLs) can give you a huge productivity boost. Instead of writing code in a general-purpose programming language, you can first build a custom language ......一起来看看 《Language Implementation Patterns》 这本书的介绍吧!