如何在android中绘制一条线
任何人都可以告诉如何在Android中画一条线,也许有一个例子吗?
这个在屏幕的左上angular绘制两条线形成十字:
DrawView.java
import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class DrawView extends View { Paint paint = new Paint(); private void init() { paint.setColor(Color.BLACK); } public DrawView(Context context) { super(context); init(); } public DrawView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DrawView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } @Override public void onDraw(Canvas canvas) { canvas.drawLine(0, 0, 20, 20, paint); canvas.drawLine(20, 0, 0, 20, paint); } }
开始它的活动:
StartDraw.java
import android.app.Activity; import android.graphics.Color; import android.os.Bundle; public class StartDraw extends Activity { DrawView drawView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); drawView = new DrawView(this); drawView.setBackgroundColor(Color.WHITE); setContentView(drawView); } }
如果你想在你的布局中有一个简单的线来分隔两个视图,你可以使用一个普通的视图,其中包含你想要的线条的高度和宽度以及设置的背景颜色。
使用这种方法,您不需要重写视图或自己使用Canvas,只需简单,干净地在xml中添加行即可。
<View android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/black" />
我提供的示例代码将生成一个宽度为1,填充高度为1的屏幕。
如果您在小屏幕上绘制线条时遇到问题,请考虑将线条的高度更改为px。 问题是,在一个ldpi屏幕上,线将是0.75像素高。 有时候这可能会导致四舍五入,从而消失。 如果这是您的布局的问题定义一个资源文件行的宽度,并为小屏幕创build一个单独的资源文件,将值设置为1px而不是1dp。
这种方法只有在需要用于分割布局元素的水平线或垂直线时才可用。 如果你想实现像被绘制成图像的十字架那样的东西,我的方法将无法工作。
有两种主要方法可以通过使用Canvas
或使用View
来绘制线条。
用canvas画一条线
从文档中我们看到,我们需要使用以下方法:
drawLine (float startX, float startY, float stopX, float stopY, Paint paint)
这是一张图片:
Paint
对象只是告诉Canvas
画线的颜色,它应该有多宽,等等。
这是一些示例代码:
private Paint paint = new Paint(); .... private void init() { paint.setColor(Color.BLACK); paint.setStrokeWidth(1f); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); startX = 20; startY = 100; stopX = 140; stopY = 30; canvas.drawLine(startX, startY, stopX, stopY, paint); }
用视图画一条线
如果你只需要一个水平或垂直的直线,那么最简单的方法就是在你的xml布局文件中使用View
。 你会做这样的事情:
<View android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/black" />
这是一个两行(一个水平和一个垂直)的图片,以显示它的样子:
这里是完整的XML布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="TextView1 in vertical linear layout" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/black" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="TextView2 in vertical linear layout" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:layout_width="100dp" android:layout_height="100dp" android:padding="10dp" android:text="TextView3 in horizontal linear layout" /> <View android:layout_width="1dp" android:layout_height="match_parent" android:background="@android:color/black" /> <TextView android:layout_width="100dp" android:layout_height="100dp" android:padding="10dp" android:text="TextView4 in horizontal linear layout" /> </LinearLayout> </LinearLayout>
您可以在视图中使用在Android的开发人员的手指油漆示例绘制多条直线。 示例链接
刚刚评论: mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
你将能够绘制直线。
import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; public class JoinPointsActivity extends Activity { /** Called when the activity is first created. */ Paint mPaint; float Mx1,My1; float x,y; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.main); MyView view1 =new MyView(this); view1.setBackgroundResource(R.drawable.image_0031_layer_1); setContentView(view1); 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(10); } public class MyView extends View { private static final float MINP = 0.25f; private static final float MAXP = 0.75f; private Bitmap mBitmap; private Canvas mCanvas; private Path mPath; private Paint mBitmapPaint; public MyView(Context c) { super(c); mPath = new Path(); mBitmapPaint = new Paint(Paint.DITHER_FLAG); } @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.drawColor(0xFFAAAAAA); // canvas.drawLine(mX, mY, Mx1, My1, mPaint); // canvas.drawLine(mX, mY, x, y, mPaint); 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(); // Mx1=(int) event.getX(); // My1= (int) event.getY(); invalidate(); break; } return true; } } }
package com.example.helloandroid; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.view.View; public class HelloAndroid2Activity extends Activity { /** Called when the activity is first created. */ DrawView drawView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); drawView = new DrawView(this); drawView.setBackgroundColor(Color.WHITE); setContentView(drawView); } class DrawView extends View { Paint paint = new Paint(); public DrawView(Context context) { super(context); paint.setColor(Color.BLUE); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawLine(10, 20, 30, 40, paint); canvas.drawLine(20, 10, 50, 20, paint); } } }
对于布局上的水平线:
<View android:id="@+id/View03" android:layout_width="fill_parent" android:layout_height="5dip" android:background="#0f0" />
对于布局上的垂直线:
<View android:id="@+id/View04" android:layout_width="5dip" android:layout_height="fill_parent" android:background="#0f0" />
canvas.drawLine(10, 10, 90, 10, paint); canvas.drawLine(10, 20, 90, 20, paint);
这将创build一个直线水平线,希望它有帮助!
简单的一个
<TextView android:layout_width="match_parent" android:layout_height="1dp" android:background="#c0c0c0" android:id="@+id/your_id" android:layout_marginTop="160dp" />
final SurfaceView surf = (SurfaceView)findViewById(R.id.surface_home); surf.setOnTouchListener( new SurfaceView.OnTouchListener(){ private boolean moving = false;//stupid state public boolean onTouch(View v, MotionEvent event) { switch( event.getAction() ){ case MotionEvent.ACTION_DOWN: final int x = (int)event.getX(); final int y = (int)event.getY(); final Rect bounds = mTiles.getBounds(); moving = bounds.intersects(x, y, x+1, y+1); return true; case MotionEvent.ACTION_MOVE: if( moving ){ final int x_new = (int)event.getX(); final int y_new = (int)event.getY(); mDrawTiles.draw( new DrawLogic(){ public void draw(Rect _surface) { mTiles.setBounds( x_new - mDrawWidth/2, y_new - mDrawHeight/2, x_new + mDrawWidth/2, y_new + mDrawHeight/2); } });
另一种使用ImageView以编程方式绘制线条的方法
import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Typeface; import android.os.Bundle; import android.widget.ImageView; public class Test extends Activity { ImageView drawingImageView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); drawingImageView = (ImageView) this.findViewById(R.id.DrawingImageView); Bitmap bitmap = Bitmap.createBitmap((int) getWindowManager() .getDefaultDisplay().getWidth(), (int) getWindowManager() .getDefaultDisplay().getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawingImageView.setImageBitmap(bitmap); // Line Paint paint = new Paint(); paint.setColor(Color.GREEN); paint.setStrokeWidth(10); int startx = 50; int starty = 100; int endx = 150; int endy = 210; canvas.drawLine(startx, starty, endx, endy, paint); } }
此代码将水平线添加到线性布局
View view = new View(this); LinearLayout.LayoutParams lpView = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 1); // --> horizontal view.setLayoutParams(lpView); view.setBackgroundColor(Color.DKGRAY); linearLayout.addView(view);
你可以通过xml中的形状来绘制一个像circle,line,rectangle等drawable,如下所示:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line" > <solid android:color="#00000000" /> <stroke android:width="2dp" android:color="#808080" /> </shape>
改进@Janusz提供的答案
我将这添加到我的样式中:
<style name="Divider"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">1dp</item> <item name="android:background">?android:attr/listDivider</item> </style>
然后在我的布局是更less的代码和更简单的阅读。
<View style="@style/Divider"/>
如果你想做水平线间距然后做上面的。
而对于两个视图之间的垂直线,您必须用android:layout_heightreplaceandroid:layout_width参数(属性)
或者如果你只是想要一条线
TextView line = new TextView(this); line.setBackgroundResource(android.R.color.holo_red_dark); line.setHeight((int) Utility.convertDpToPixel(1,this));