ti-enxame.com

Como desenhar uma linha no android

Alguém pode dizer como desenhar uma linha no Android, talvez com um exemplo?

137
mohan

Este desenha duas linhas que formam uma cruz no canto superior esquerdo da tela:

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

}

A atividade para iniciá-lo:

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);

    }
}
161
DonGru

Se você quiser ter uma linha simples em seu layout para separar duas visualizações, você pode usar uma visualização genérica com a altura e a largura que deseja que a linha tenha e uma cor de fundo definida. 

Com essa abordagem, você não precisa substituir uma View ou usar uma Canvas apenas simples e limpa, adicione a linha em xml. 

<View
 Android:layout_width="match_parent"
 Android:layout_height="1dp"
 Android:background="@Android:color/black" />

O código de exemplo que forneci irá gerar uma linha que preenche a tela em largura e tem uma altura de um dp. 

Se você tiver problemas com o desenho da linha em telas pequenas, considere alterar a altura da linha para px. O problema é que em uma tela ldpi a linha terá 0,75 pixel de altura. Às vezes isso pode resultar em um arredondamento que faz a linha desaparecer. Se isso for um problema para o layout, defina a largura da linha como um arquivo de recursos e crie um arquivo de recursos separado para telas pequenas que define o valor como 1px em vez de 1dp.

Essa abordagem só pode ser usada se você quiser linhas horizontais ou verticais usadas para dividir elementos de layout. Se você quiser alcançar algo como uma cruz que é desenhada em uma imagem, minha abordagem não funcionará.

218
Janusz

Existem duas maneiras principais de desenhar uma linha, usando um Canvas ou usando um View.

Desenhar uma linha com tela

A partir da documentation , vemos que precisamos usar o seguinte método:

drawLine (float startX, float startY, float stopX, float stopY, Paint paint)

Aqui está uma foto:

canvas.drawLine

O objeto Paint apenas informa Canvas de qual cor pintar a linha, quão ampla ela deve ser, e assim por diante.

Aqui está um código de amostra:

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

Desenhando uma linha com vista

Se você só precisa de uma linha reta horizontal ou vertical, então a maneira mais fácil pode ser apenas usar um View no seu arquivo de layout xml. Você faria algo assim:

<View
    Android:layout_width="match_parent"
    Android:layout_height="1dp"
    Android:background="@Android:color/black" />

Aqui está uma foto com duas linhas (uma horizontal e uma vertical) para mostrar como ficaria:

drawing a line with a view in xml layout

E aqui está o layout xml completo para isso:

<?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>
56
Suragch

Você pode desenhar várias linhas retas na visualização usando o exemplo do Finger Paint, que está no Developer Android. exemplo link

Apenas comente: mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); Você poderá desenhar linhas retas.

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;
        }
    }

}
20
Hema
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);

        }
}
}
10
vinay

para linha horizontal no layout:

 <View
            Android:id="@+id/View03"
            Android:layout_width="fill_parent"
            Android:layout_height="5dip"
            Android:background="#0f0" />

para linha vertical no layout:

<View
        Android:id="@+id/View04"
        Android:layout_width="5dip"
        Android:layout_height="fill_parent"
        Android:background="#0f0" />
9
Mohanraj

Um simples

 <TextView
    Android:layout_width="match_parent"
    Android:layout_height="1dp"
    Android:background="#c0c0c0"
    Android:id="@+id/your_id"
    Android:layout_marginTop="160dp" />
6
shreedhar bhat
canvas.drawLine(10, 10, 90, 10, Paint);
canvas.drawLine(10, 20, 90, 20, Paint);

Isto irá criar uma linha reta horizontal, espero que ajude !.

6
user712051

este código adiciona linha horizontal a um layout linear

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);
3
user4757345
  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);
                                        }
                                    });
3
Sahil Mahajan Mj

Você pode fazer um drawable como círculo, linha, retângulo, etc através de formas em xml da seguinte forma:

<?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>
3
Muhammad Aamir Ali

Para melhorar as respostas fornecidas pelo @Janusz

Eu adicionei isso aos meus estilos:

<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>

Então, nos meus layouts é menos código e mais simples de ler.

<View style="@style/Divider"/>

se você quiser fazer o espaçamento entre linhas horizontais, faça o acima. 


E para a linha vertical entre dois modos de exibição, você precisa substituir os parâmetros do Android: layout_width (atributos) pelo Android: layout_height

2
Xar E Ahmer

Se você estiver trabalhando com ConstraintLayout, precisará definir pelo menos duas restrições para a linha a ser exibida. Como isso:

<View
        Android:layout_width="0dp"
        Android:layout_height="1dp"
        Android:background="@Android:color/black"
        app:layout_constraintEnd_toEndOf="@+id/someView1"
        app:layout_constraintStart_toStartOf="@+id/someView2"
        app:layout_constraintTop_toBottomOf="@+id/someView3" />

Embora eu tenha definido 3 restrições.

0
Kashif

ou se você quer apenas uma linha

TextView line = new TextView(this);
            line.setBackgroundResource(Android.R.color.holo_red_dark);
            line.setHeight((int) Utility.convertDpToPixel(1,this));
0
Prajwal Udupa