Android में लाइन कैसे ड्रा करें


157

क्या कोई बता सकता है कि एंड्रॉइड में एक रेखा कैसे खींची जाए, शायद एक उदाहरण के साथ?


4
क्या आप किसी चीज़ में एक रेखा खींचना चाहते हैं या आप लेआउट में एक सरल रेखा खींचना चाहते हैं?
Janusz

जवाबों:


174

यह एक 2 रेखाएँ खींचती है जो स्क्रीन के ऊपर बाईं ओर एक क्रॉस बनाती है:

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

    }
}

3
अगर मैं R.layout.main की तरह कुछ अन्य गतिविधि में एक पंक्ति जोड़ना चाहता हूं तो मैं कैसे जोड़ सकता हूं?
मोहन

1
आपकी गतिविधि के लेआउट में एक दृश्य ऑब्जेक्ट समाहित करना है - फिर यह कोई समस्या नहीं है। आपको बस ड्रॉ करने के लिए एक ऑब्जेक्ट की आवश्यकता है
DonGru

1
मैं एक सीधी रेखा खींचना चाहता हूं कि मैं मूल्य startx start y stopx stopy कैसे दे सकता हूं?
मोहन

वास्तव में आप पा सकते हैं कि Android डेवलपर संदर्भ में, drawLine () में निम्नलिखित तर्क हैं: drawLine (float startX, float startY, float stopX, float stopY, Paint paint)
DonGru

मैं इस पद्धति का उपयोग करके पृष्ठभूमि पर रेखा खींचता हूं। मैं एक खींची हुई रेखा को मिटाना चाहता हूं। मेरे लिए कोई सुझाव। क्या आप मुझे सुझाव दे सकते हैं?
tientuyen07

240

यदि आप दो लेआउट को अलग करने के लिए अपने लेआउट में एक सरल रेखा रखना चाहते हैं, तो आप जिस ऊंचाई और चौड़ाई के लिए लाइन चाहते हैं और एक सेट बैकग्राउंड रंग के साथ एक सामान्य दृश्य का उपयोग कर सकते हैं।

इस दृष्टिकोण के साथ आपको एक व्यू को ओवरराइड करने या अपने आप को कैनवस का उपयोग करने की आवश्यकता नहीं है, बस सरल और साफ xml में लाइन जोड़ें।

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

मैंने जो उदाहरण कोड प्रदान किया है, वह एक ऐसी लाइन उत्पन्न करेगा जो स्क्रीन को चौड़ाई में भरती है और जिसकी एक dp की ऊँचाई होती है।

यदि आपको छोटी स्क्रीन पर लाइन के ड्राइंग के साथ समस्याएं हैं, तो लाइन की ऊंचाई को px में बदलने के लिए विचार करें। समस्या यह है कि एक ldpi स्क्रीन पर लाइन 0.75 पिक्सेल ऊँची होगी। कभी-कभी यह एक गोलाई में हो सकता है जो लाइन को गायब कर देता है। यदि यह आपके लेआउट के लिए एक समस्या है, तो लाइन की चौड़ाई को एक ressource फ़ाइल को परिभाषित करें और छोटे स्क्रीन के लिए एक अलग ressource फ़ाइल बनाएं जो मान 1dp के बजाय 1px पर सेट करता है।

यह दृष्टिकोण केवल उपयोग करने योग्य है यदि आप क्षैतिज या ऊर्ध्वाधर लाइनें चाहते हैं जो लेआउट तत्वों को विभाजित करने के लिए उपयोग की जाती हैं। यदि आप एक क्रॉस की तरह कुछ हासिल करना चाहते हैं जो एक छवि में खींचा गया है तो मेरा दृष्टिकोण काम नहीं करेगा।


गतिशील रूप से रनटाइम पर समान दृश्य कैसे जोड़ सकते हैं?
लक्ष्मणन

लक्ष्मणन, इसे एक आईडी देते हैं, और दृश्यता के लिए इसकी दृश्यता सेट करते हैं। रन-टाइम पर देखें या देखें
हातिम

इस समाधान के साथ एक क्रॉस भी बनाया जा सकता है, बस आप जो चाहें उस क्रॉस के अनुसार "रोटेशन" विशेषता जोड़ें और दो दृश्यों का उपयोग करें।
अर्पित जे

62

दो मुख्य तरीके हैं जो आप एक रेखा खींच सकते हैं, एक का उपयोग करके Canvasया एक का उपयोग करके View

कैनवास के साथ एक रेखा खींचना

से प्रलेखन हम देखते हैं कि हम निम्न विधि का उपयोग करने की आवश्यकता है:

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

यहाँ एक तस्वीर है:

canvas.drawLine

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

दृश्य के साथ एक रेखा खींचना

यदि आपको केवल एक सीधी क्षैतिज या ऊर्ध्वाधर रेखा की आवश्यकता है, तो सबसे आसान तरीका यह हो सकता है कि Viewआप अपनी xml लेआउट फ़ाइल में केवल एक का उपयोग करें। आप ऐसा कुछ करेंगे:

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

यहाँ दो पंक्तियों (एक क्षैतिज और एक ऊर्ध्वाधर) के साथ एक तस्वीर है, यह दिखाने के लिए कि यह कैसा दिखेगा:

xml लेआउट में एक दृश्य के साथ एक रेखा खींचना

और यहाँ उस के लिए पूरा 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>

आप एक प्रतिभाशाली भाई हैं ... मैं यह जानने की कोशिश कर रहा हूं कि पेंट का उपयोग करके एक दृश्य को चित्रित करते समय वे कैसे निर्देशांक प्राप्त करते हैं ... लेकिन आपने जो चित्र पोस्ट किया है, उसने मुझे इसे बहुत समझने में मदद की है ...। किसी भी ऑनलाइन उपकरण ऐसे ग्राफ को अनुकरण करने के लिए तो मैं इसे कोडिंग करते समय उपयोग करता हूं?

क्या यह जानने के लिए कॉलबैक प्राप्त करना संभव है कि दृश्य समाप्त हो गया है

Im दो अलग-अलग रेखाएँ खींचने की कोशिश कर रहा है। एक बार अगर पहली रेखा तैयार की गई है, मैं दूसरे आकर्षित करने के लिए है ...

आप एक ही onDraw में दोनों लाइनें क्यों नहीं बनाते हैं?
सूर्याग

1
@ tientuyen07, यदि आप उपयोग कर रहे हैं, onDraw()तो अपने ड्रॉइंग कोड को अपने साथ रखें if (someCondition) { draw... }, बनाएं someCondition = falseऔर फिर invalidate()अपने दृश्य पर कॉल करें । यह लाइन के बिना दृश्य को फिर से तैयार करेगा।
सूर्याग

22

आप फ़िंगर पेंट के उदाहरण का उपयोग करके कई सीधी रेखाएँ खींच सकते हैं जो डेवलपर 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;
        }
    }

}

2
क्या कोई मेरी मदद कर सकता है कि मैं अपने दृष्टिकोण पर अपने xml तत्वों को कैसे देख सकता हूं जो रिश्तेदार लेआउट पर हैं ?? यू सिर्फ उपरोक्त उदाहरण के माध्यम से जा सकते हैं और मुझे सुझाव दे सकते हैं।
हेमा

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

        }
}
}

8

लेआउट पर क्षैतिज रेखा के लिए:

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

वे दोनों एक ही हैं। ऊर्ध्वाधर और क्षैतिज के बीच अंतर क्या है?
बुरहान ARAS

@ बुरहान ARAS- वे समान नहीं हैं क्योंकि चौड़ाई और ऊंचाई दो विचारों में बदल जाती है। यह केवल ऊर्ध्वाधर और हॉरज रेखा खींचती है।
मोहनराज

7

सरल एक

 <TextView
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="#c0c0c0"
    android:id="@+id/your_id"
    android:layout_marginTop="160dp" />

5
canvas.drawLine(10, 10, 90, 10, paint);
canvas.drawLine(10, 20, 90, 20, paint);

यह एक सीधी क्षैतिज रेखा बनाएगा, आशा है कि यह मदद करेगा!।


3

आप xml में आकृतियों के माध्यम से सर्कल, लाइन, आयत इत्यादि को एक निम्न प्रकार बना सकते हैं:

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

यह कोड एक रेखीय लेआउट में क्षैतिज रेखा जोड़ता है

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

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

1

@ जानुस द्वारा दिए गए उत्तरों पर सुधार करने के लिए

मैंने इसे अपनी शैलियों में जोड़ा:

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

फिर मेरे लेआउट में कोड कम और पढ़ने में सरल है।

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

यदि आप क्षैतिज रेखा रिक्ति करना चाहते हैं तो उपरोक्त कार्य करें।


और दो दृश्यों के बीच ऊर्ध्वाधर रेखा के लिए आपको एंड्रॉइड को बदलना होगा: एंड्रॉइड के साथ लेआउट_ एक्सपोर्ट पैरामीटर (विशेषताएं): लेआउट_हाइट


1

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

  }
}

1

यदि आप साथ काम कर रहे हैं तो आपको ConstraintLayoutदिखाने के लिए लाइन के लिए कम से कम 2 बाधाओं को परिभाषित करने की आवश्यकता है। ऐशे ही:

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

हालांकि मैंने 3 बाधाओं को परिभाषित किया।


-1

या यदि आप सिर्फ एक लाइन चाहते हैं

TextView line = new TextView(this);
            line.setBackgroundResource(android.R.color.holo_red_dark);
            line.setHeight((int) Utility.convertDpToPixel(1,this));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.