software - android system download




एंड्रॉइड में एक रेखा कैसे आकर्षित करें (10)

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


सरल एक

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

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

  }
}

आप डेवलपर एंड्रॉइड में फिंगर पेंट उदाहरण का उपयोग करके कई सीधी रेखाएं देख सकते हैं। उदाहरण लिंक

बस टिप्पणी करें: 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;
        }
    }

}

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

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

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

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

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

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


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

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

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

TextView line = new TextView(this);
            line.setBackgroundResource(android.R.color.holo_red_dark);
            line.setHeight((int) Utility.convertDpToPixel(1,this));

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

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

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

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

व्यू के साथ एक रेखा खींचना

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

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

यहां एक तस्वीर है जिसमें दो रेखाएं हैं (एक क्षैतिज और एक लंबवत) यह दिखाने के लिए कि यह कैसा दिखता है:

और यहां इसके लिए पूर्ण एक्सएमएल लेआउट है:

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

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

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

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

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

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


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

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


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

        }
}
}






android