jeśli chcę dodać wiersz w innej aktywności, takiej jak R.layout.main Jak mogę dodać?
mohan
1
układ Twojej aktywności musi zawierać obiekt View - wtedy nie ma problemu. Potrzebujesz tylko obiektu widoku do rysowania
DonGru
1
Chcę narysować prostą linię. Jak mogę podać wartość startx start y stopx stopy?
mohan,
w rzeczywistości możesz stwierdzić, że w dokumentacji programisty Androida funkcja drawLine () ma następujące argumenty: drawLine (float startX, float startY, float stopX, float stopY, Paint paint)
DonGru
Tą metodą rysuję linię na tle. Chcę wymazać narysowaną linię. Wszelkie sugestie dla mnie. Czy możesz mi zasugerować?
tientuyen07
240
Jeśli chcesz mieć prostą linię w swoim układzie, aby oddzielić dwa widoki, możesz użyć ogólnego widoku z wysokością i szerokością, jaką ma mieć linia oraz ustawionym kolorem tła.
Dzięki takiemu podejściu nie musisz samodzielnie zastępować widoku ani używać płótna, po prostu w prosty i czysty sposób dodaj wiersz w xml.
Przykładowy kod, który podałem, wygeneruje linię, która wypełni ekran na szerokość i będzie miała wysokość jednego dp.
Jeśli masz problemy z rysowaniem linii na małych ekranach, rozważ zmianę wysokości linii na px. Problem polega na tym, że na ekranie ldpi linia będzie miała wysokość 0,75 piksela. Czasami może to spowodować zaokrąglenie, które powoduje zniknięcie linii. Jeśli jest to problem z układem, zdefiniuj szerokość linii w pliku zasobów i utwórz oddzielny plik zasobów dla małych ekranów, który ustawi wartość na 1 piksel zamiast 1 dp.
To podejście jest użyteczne tylko wtedy, gdy potrzebujesz poziomych lub pionowych linii, które są używane do dzielenia elementów układu. Jeśli chcesz osiągnąć coś w rodzaju krzyża, który jest narysowany na obrazie, moje podejście nie zadziała.
Oto zdjęcie z dwiema liniami (jedną poziomą i jedną pionową), aby pokazać, jak by to wyglądało:
A oto kompletny układ XML do tego:
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"android:text="TextView1 in vertical linear layout"/><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@android:color/black"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"android:text="TextView2 in vertical linear layout"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:layout_width="100dp"android:layout_height="100dp"android:padding="10dp"android:text="TextView3 in horizontal linear layout"/><Viewandroid:layout_width="1dp"android:layout_height="match_parent"android:background="@android:color/black"/><TextViewandroid:layout_width="100dp"android:layout_height="100dp"android:padding="10dp"android:text="TextView4 in horizontal linear layout"/></LinearLayout></LinearLayout>
jesteś genialnym bratem ... Próbowałem dowiedzieć się, w jaki sposób uzyskują współrzędne podczas rysowania widoku za pomocą farby ... ale zdjęcie, które opublikowałeś, pomogło mi to zrozumieć ... jakieś narzędzie online do symulacji takiego wykresu, więc używam go podczas kodowania?
czy można uzyskać oddzwonienie, aby wiedzieć, że widok został zakończony rysowaniem
Próbuję narysować dwie różne linie. Kiedyś, jeśli pierwsza linia została narysowana, muszę narysować drugą ...
Dlaczego nie narysujesz obu linii w tym samym onDraw?
Suragch
1
@ tientuyen07, Jeśli używasz, otocz onDraw()kod rysowania za pomocą if (someCondition) { draw... }, wykonaj someCondition = false, a następnie przywołaj invalidate()swój widok. Przerysuje widok bez linii.
Suragch
22
Możesz narysować wiele linii prostych na widoku, używając przykładu malowania palcem, który jest w Androidzie dla programistów.
przykładowy link
Tylko komentarz: mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
będziesz mógł rysować proste linie.
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;publicclassJoinPointsActivityextendsActivity{/** Called when the activity is first created. */Paint mPaint;floatMx1,My1;float x,y;@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// setContentView(R.layout.main);MyView view1 =newMyView(this);
view1.setBackgroundResource(R.drawable.image_0031_layer_1);
setContentView(view1);
mPaint =newPaint();
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);}publicclassMyViewextendsView{privatestaticfinalfloat MINP =0.25f;privatestaticfinalfloat MAXP =0.75f;privateBitmap mBitmap;privateCanvas mCanvas;privatePath mPath;privatePaint mBitmapPaint;publicMyView(Context c){super(c);
mPath =newPath();
mBitmapPaint =newPaint(Paint.DITHER_FLAG);}@Overrideprotectedvoid 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 =newCanvas(mBitmap);}@Overrideprotectedvoid 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);}privatefloat mX, mY;privatestaticfinalfloat TOUCH_TOLERANCE =4;privatevoid touch_start(float x,float y){
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;}privatevoid 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;}}privatevoid 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();}@Overridepublicboolean onTouchEvent(MotionEventevent){float x =event.getX();float y =event.getY();switch(event.getAction()){caseMotionEvent.ACTION_DOWN:
touch_start(x, y);
invalidate();break;caseMotionEvent.ACTION_MOVE:
touch_move(x, y);
invalidate();break;caseMotionEvent.ACTION_UP:
touch_up();// Mx1=(int) event.getX();// My1= (int) event.getY();
invalidate();break;}returntrue;}}}
Czy ktoś może mi pomóc, jak mogę zobaczyć moje elementy xml w moim widoku, które mają układ względny? możesz po prostu przejść przez powyższy przykład i zasugerować mi.
Hema
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;publicclassHelloAndroid2ActivityextendsActivity{/** Called when the activity is first created. */DrawView drawView;@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
drawView =newDrawView(this);
drawView.setBackgroundColor(Color.WHITE);
setContentView(drawView);}classDrawViewextendsView{Paint paint =newPaint();publicDrawView(Context context){super(context);
paint.setColor(Color.BLUE);}@Overridepublicvoid onDraw(Canvas canvas){super.onDraw(canvas);
canvas.drawLine(10,20,30,40, paint);
canvas.drawLine(20,10,50,20, paint);}}}
Odpowiedzi:
Ten rysuje 2 linie, które tworzą krzyż w lewym górnym rogu ekranu:
DrawView.java
Czynność, aby ją rozpocząć:
StartDraw.java
źródło
Jeśli chcesz mieć prostą linię w swoim układzie, aby oddzielić dwa widoki, możesz użyć ogólnego widoku z wysokością i szerokością, jaką ma mieć linia oraz ustawionym kolorem tła.
Dzięki takiemu podejściu nie musisz samodzielnie zastępować widoku ani używać płótna, po prostu w prosty i czysty sposób dodaj wiersz w xml.
Przykładowy kod, który podałem, wygeneruje linię, która wypełni ekran na szerokość i będzie miała wysokość jednego dp.
Jeśli masz problemy z rysowaniem linii na małych ekranach, rozważ zmianę wysokości linii na px. Problem polega na tym, że na ekranie ldpi linia będzie miała wysokość 0,75 piksela. Czasami może to spowodować zaokrąglenie, które powoduje zniknięcie linii. Jeśli jest to problem z układem, zdefiniuj szerokość linii w pliku zasobów i utwórz oddzielny plik zasobów dla małych ekranów, który ustawi wartość na 1 piksel zamiast 1 dp.
To podejście jest użyteczne tylko wtedy, gdy potrzebujesz poziomych lub pionowych linii, które są używane do dzielenia elementów układu. Jeśli chcesz osiągnąć coś w rodzaju krzyża, który jest narysowany na obrazie, moje podejście nie zadziała.
źródło
Istnieją dwa główne sposoby narysowania linii, używając
Canvas
lub używającView
.Rysowanie linii na płótnie
Z dokumentacji widzimy, że musimy skorzystać z następującej metody:
Oto zdjęcie:
Paint
Obiekt tylko powieCanvas
jaki kolor pomalować linię, jak szeroki powinien być, i tak dalej.Oto przykładowy kod:
Rysowanie linii z widokiem
Jeśli potrzebujesz tylko prostej linii poziomej lub pionowej, najłatwiejszym sposobem może być użycie
View
w pliku układu xml. Zrobiłbyś coś takiego:Oto zdjęcie z dwiema liniami (jedną poziomą i jedną pionową), aby pokazać, jak by to wyglądało:
A oto kompletny układ XML do tego:
źródło
onDraw()
kod rysowania za pomocąif (someCondition) { draw... }
, wykonajsomeCondition = false
, a następnie przywołajinvalidate()
swój widok. Przerysuje widok bez linii.Możesz narysować wiele linii prostych na widoku, używając przykładu malowania palcem, który jest w Androidzie dla programistów. przykładowy link
Tylko komentarz:
mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
będziesz mógł rysować proste linie.źródło
źródło
dla linii poziomej na układzie:
dla linii pionowej na arkuszu:
źródło
Prosty
źródło
Stworzy to prostą poziomą linię, mam nadzieję, że to pomoże!
źródło
Możesz stworzyć rysowalny okrąg, linię, prostokąt itp. Poprzez kształty w xml w następujący sposób:
źródło
ten kod dodaje poziomą linię do układu liniowego
źródło
źródło
Aby poprawić odpowiedzi udzielone przez @Janusz
Dodałem to do moich stylów:
Wtedy w moich układach jest mniej kodu i prostsze do odczytania.
jeśli chcesz zrobić poziome odstępy między wierszami, wykonaj powyższe czynności.
A dla linii pionowej między dwoma widokami musisz zastąpić parametry android: layout_width (atrybuty) android: layout_height
źródło
Inne podejście do programowego rysowania linii przy użyciu ImageView
źródło
Jeśli pracujesz z
ConstraintLayout
, musisz zdefiniować co najmniej 2 ograniczenia, aby linia się pojawiła. Lubię to:Chociaż zdefiniowałem 3 ograniczenia.
źródło
lub jeśli chcesz tylko linię
źródło