内容简介:翻译自: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数据的实现方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。