অ্যান্ড্রয়েডে কীভাবে একটি লাইন আঁকবেন


157

অ্যান্ড্রয়েডে কোনও রেখা আঁকতে কীভাবে কেউ বলতে পারেন, সম্ভবত একটি উদাহরণ সহ?


4
আপনি কি কোনও কিছুর মধ্যে একটি লাইন আঁকতে চান বা লেআউটটিতে একটি সাধারণ রেখা আঁকতে চান?
জানুস

উত্তর:


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
যদি আমি আর কিছু ক্রিয়াকলাপের মতো একটি রেখা যুক্ত করতে চাই তবে আরএলআউট.মাইন আমি কীভাবে যুক্ত করতে পারি?
মোহন

1
আপনার ক্রিয়াকলাপের বিন্যাসে একটি ভিউ অবজেক্ট থাকতে হবে - তারপরে কোনও সমস্যা নেই। আপনার আঁকার জন্য কেবলমাত্র একটি ভিউ অবজেক্ট দরকার
ডোনগ্রু

1
আমি একটি সরল রেখা আঁকতে চাই কীভাবে আমি স্টার্টেক্স মানটি স্টপেক্স স্টপিকে দিতে পারি?
mohan

প্রকৃতপক্ষে আপনি অ্যান্ড্রয়েড বিকাশকারী রেফারেন্সে এটি দেখতে পারেন যে ড্রলাইন () এর নিম্নলিখিত যুক্তি রয়েছে: ড্রলাইন (ফ্লোট স্টার্টএক্স, ফ্ল্যাট স্টার্টওয়াই, ফ্লোট স্টপ এক্স, ফ্লোট স্টপওয়াই, পেইন্ট পেইন্ট)
ডোনগ্রু

আমি এই পদ্ধতিটি ব্যবহার করে পটভূমিতে লাইন আঁকছি। আমি একটি টানা লাইনটি মুছতে চাই। আমার জন্য কোন পরামর্শ। আপনি আমাকে পরামর্শ দিতে পারেন?
tientuyen07

240

আপনি যদি দুটি বিন্যাস পৃথক করতে আপনার লেআউটে একটি সরল রেখা রাখতে চান তবে আপনি যে উচ্চতা এবং প্রস্থের সাথে লাইনটি রাখতে চান এবং একটি সেট ব্যাকগ্রাউন্ড রঙ চান তার সাথে একটি জেনেরিক ভিউ ব্যবহার করতে পারেন।

এই পদ্ধতির সাহায্যে আপনার কোনও ভিউ ওভাররাইড করার দরকার নেই বা নিজেকে খালি একটি ক্যানভাস ব্যবহার করার দরকার নেই এবং এক্সএমএলটিতে লাইন যুক্ত করতে হবে।

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

আমি যে উদাহরণ কোডটি দিয়েছি তা একটি লাইন তৈরি করবে যা স্ক্রিনের প্রস্থে পূর্ণ হয় এবং এর উচ্চতা এক ডিপি হয়।

আপনার যদি ছোট পর্দার রেখার অঙ্কন নিয়ে সমস্যা হয় তবে লাইনটির উচ্চতা পিক্সে পরিবর্তন হিসাবে বিবেচনা করুন। সমস্যাটি হল একটি এলডিপিআই স্ক্রিনে লাইনটি 0.75 পিক্সেল উচ্চ হবে be কখনও কখনও এর ফলে গোলাকার হতে পারে যা লাইনটি অদৃশ্য করে। আপনার লেআউটের ক্ষেত্রে যদি সমস্যা হয় তবে লাইনটির একটি প্রস্থ একটি রিসোর্স ফাইলের প্রস্থ নির্ধারণ করুন এবং ছোট পর্দার জন্য একটি পৃথক রিসোর্স ফাইল তৈরি করুন যা মান 1dp এর পরিবর্তে 1px এ সেট করে।

আপনি যদি অনুভূমিক বা উল্লম্ব লাইনগুলি লেআউট উপাদানগুলিকে বিভক্ত করতে ব্যবহার করতে চান তবেই এই পদ্ধতির ব্যবহারযোগ্য। আপনি যদি কোনও চিত্রের মতো ক্রসের মতো কিছু অর্জন করতে চান তবে আমার পদ্ধতির কাজ হবে না।


গতিশীলভাবে রানটাইমে একই দৃশ্যটি কীভাবে যুক্ত করা যায়?
লক্ষ্মণন

লক্ষ্মণন, এটির একটি আইডি দিন এবং তার দৃশ্যমানতাটি সেট করুন G রান-টাইমে যান বা ভিসিবল করুন
হাতিম

এই সমাধানের সাথে একটি ক্রসও তৈরি করা যেতে পারে, আপনার যে ক্রসটি চান তা অনুযায়ী এটিতে "ঘূর্ণন" বৈশিষ্ট্য যুক্ত করুন এবং দুটি মতামত ব্যবহার করুন।
অর্পিত জে।

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আপনার এক্সএমএল লেআউট ফাইলটিতে কেবল একটি ব্যবহার করা । আপনি এই জাতীয় কিছু করবেন:

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

আপনি একজন প্রতিভা ভাই ... আমি পেইন্ট ব্যবহার করে একটি দৃশ্য আঁকতে গিয়ে তারা কীভাবে স্থানাঙ্কগুলি পেলেন তা জানার চেষ্টা করছিলাম ... তবে আপনি যে ছবি পোস্ট করেছেন তা আমাকে এটি বেশ বুঝতে সাহায্য করেছে .... আছে কি? এই জাতীয় গ্রাফ অনুকরণ করার জন্য কোনও অনলাইন সরঞ্জাম যাতে কোডিংয়ের সময় আমি এটি ব্যবহার করি?


আমি দুটি ভিন্ন লাইন আঁকতে চেষ্টা করছি। একবার যদি প্রথম লাইনটি

আপনি কেন একই অনড্রয়ে উভয় লাইন আঁকেন না?
সুরগচ

1
@ tientuyen07, আপনি যদি ব্যবহার করেন onDraw()তবে আপনার অঙ্কন কোডটি ঘিরে ফেলুন, if (someCondition) { draw... }তৈরি করুন someCondition = falseএবং তারপরে invalidate()আপনার ভিউতে কল করুন। এটি লাইন ছাড়াই ভিউ পুনরায় আঁকবে।
সুরগাচ

22

আপনি ফিঙ্গার পেইন্ট উদাহরণ ব্যবহার করে একাধিক সরল রেখা আঁকতে পারেন যা বিকাশকারী অ্যান্ড্রয়েডে রয়েছে। উদাহরণ লিঙ্ক

কেবল মন্তব্য করুন: 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
কেউ কি আমাকে সহায়তা করতে পারে যে আমি আমার ভিউতে আমার এক্সএমএল উপাদানগুলি কীভাবে আপেক্ষিক বিন্যাসে দেখতে পারি ?? আপনি কেবল উপরের উদাহরণটি দিয়ে যেতে পারেন এবং আমাকে পরামর্শ দিতে পারেন।
হেমা

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

তারা উভয় একই। উল্লম্ব এবং অনুভূমিক মধ্যে পার্থক্য কি করে?
বুরহান এআআআএস

@ বুরহান এআআআআএস - এগুলি প্রস্থ এবং উচ্চতা দুটি দর্শনে পরিবর্তিত হওয়ার মতো নয় it এটি কেবল উল্লম্ব এবং হরজ লাইনের অঙ্কন করে।
মোহনরাজ

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

ইমেজভিউ ব্যবহার করে ক্রমগতভাবে একটি লাইন আঁকার জন্য অন্য পদ্ধতি

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));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.