Metin görünümünün çevresine kenarlık çizmek mümkün mü?
Metin görünümünün çevresine kenarlık çizmek mümkün mü?
Yanıtlar:
Görünüm için arka plan olarak çizilebilir bir şekil (dikdörtgen) ayarlayabilirsiniz.
<TextView android:text="Some text" android:background="@drawable/back"/>
Ve dikdörtgen drawable back.xml (res / drawable klasörüne koy):
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@android:color/white" />
<stroke android:width="1dip" android:color="#4fa5d5"/>
</shape>
@android:color/transparent
Düz rengin saydam bir arka plana sahip olması için kullanabilirsiniz . Metni kenarlıktan ayırmak için dolgu da kullanabilirsiniz. daha fazla bilgi için bkz. http://developer.android.com/guide/topics/resources/drawable-resource.html
Birkaç farklı (programatik olmayan) yöntemi özetleyeyim.
Aşağıdakileri çizilebilir klasörünüze XML dosyası olarak kaydedin (örneğin, my_border.xml):
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- View background color -->
<solid
android:color="@color/background_color" >
</solid>
<!-- View border color and width -->
<stroke
android:width="1dp"
android:color="@color/border_color" >
</stroke>
<!-- The radius makes the corners rounded -->
<corners
android:radius="2dp" >
</corners>
</shape>
Ardından, TextView'inizin arka planı olarak ayarlayın:
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_border" />
Daha fazla yardım:
9 yama, gerilebilir bir arka plan görüntüsüdür. Kenarlıklı bir görüntü yaparsanız, TextView öğenize bir kenarlık verir. Tek yapmanız gereken görüntüyü oluşturmak ve daha sonra TextView öğenizde arka plana ayarlamaktır.
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_ninepatch_image" />
9 yamalı bir görüntünün nasıl oluşturulacağını gösteren bazı bağlantılar şunlardır:
Katman listesi kullanma
İki dikdörtgeni üst üste yığınlamak için katman listesini kullanabilirsiniz. İkinci dikdörtgeni ilk dikdörtgenden biraz daha küçük yaparak kenarlık efekti yapabilirsiniz. İlk (alt) dikdörtgen kenarlık rengidir ve ikinci dikdörtgen arka plan rengidir.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Lower rectangle (border color) -->
<item>
<shape android:shape="rectangle">
<solid android:color="@color/border_color" />
</shape>
</item>
<!-- Upper rectangle (background color) -->
<item android:top="2dp">
<shape android:shape="rectangle">
<solid android:color="@color/background_color" />
</shape>
</item>
</layer-list>
Ayarlama android:top="2dp"
üst kısmı 2dp azaltır. Bu, ilk (alt) dikdörtgenin içinden kenar efekti vererek gösterilmesini sağlar. Bunu, TextView arka planına, shape
çekilebilir olanın yukarıda yapıldığı gibi uygulayabilirsiniz .
Katman listeleri hakkında bazı bağlantılar:
9 yama kullanma
Tek bir kenarlıkla 9 yama görüntüsü oluşturabilirsiniz. Diğer her şey yukarıda tartışılanla aynıdır.
Görünüm Kullanma
Bu bir tür hile ama tek bir TextView için iki görünüm veya bir kenar arasında bir ayırıcı eklemek gerekirse iyi çalışır.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textview1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!-- This adds a border between the TextViews -->
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@android:color/black" />
<TextView
android:id="@+id/textview2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
İşte bazı bağlantılar:
border: 1px solid #999;
gerekiyordu değil bu karmaşık.
Basit yol, TextView için bir görünüm eklemektir. Alt kenar çizgisi örneği:
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:text="@string/title"
android:id="@+id/title_label"
android:gravity="center_vertical"/>
<View
android:layout_width="fill_parent"
android:layout_height="0.2dp"
android:id="@+id/separator"
android:visibility="visible"
android:background="@android:color/darker_gray"/>
</LinearLayout>
Diğer yön sınırları için, lütfen ayırıcı görünümünün konumunu ayarlayın.
Metin görünümünü genişleterek ve elle bir kenarlık çizerek bu sorunu çözdüm. Bir kenarlığın noktalı mi yoksa kesikli mi olacağını da seçebilmeniz için ekledim.
public class BorderedTextView extends TextView {
private Paint paint = new Paint();
public static final int BORDER_TOP = 0x00000001;
public static final int BORDER_RIGHT = 0x00000002;
public static final int BORDER_BOTTOM = 0x00000004;
public static final int BORDER_LEFT = 0x00000008;
private Border[] borders;
public BorderedTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public BorderedTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public BorderedTextView(Context context) {
super(context);
init();
}
private void init(){
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLACK);
paint.setStrokeWidth(4);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(borders == null) return;
for(Border border : borders){
paint.setColor(border.getColor());
paint.setStrokeWidth(border.getWidth());
if(border.getStyle() == BORDER_TOP){
canvas.drawLine(0, 0, getWidth(), 0, paint);
} else
if(border.getStyle() == BORDER_RIGHT){
canvas.drawLine(getWidth(), 0, getWidth(), getHeight(), paint);
} else
if(border.getStyle() == BORDER_BOTTOM){
canvas.drawLine(0, getHeight(), getWidth(), getHeight(), paint);
} else
if(border.getStyle() == BORDER_LEFT){
canvas.drawLine(0, 0, 0, getHeight(), paint);
}
}
}
public Border[] getBorders() {
return borders;
}
public void setBorders(Border[] borders) {
this.borders = borders;
}
}
Ve sınır sınıfı:
public class Border {
private int orientation;
private int width;
private int color = Color.BLACK;
private int style;
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public int getStyle() {
return style;
}
public void setStyle(int style) {
this.style = style;
}
public int getOrientation() {
return orientation;
}
public void setOrientation(int orientation) {
this.orientation = orientation;
}
public Border(int Style) {
this.style = Style;
}
}
Umarım bu birine yardımcı olur :)
Sadece benzer bir cevaba bakıyordum - bir İnme ve aşağıdaki geçersiz kılma ile yapılabilir:
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Paint strokePaint = new Paint();
strokePaint.setARGB(255, 0, 0, 0);
strokePaint.setTextAlign(Paint.Align.CENTER);
strokePaint.setTextSize(16);
strokePaint.setTypeface(Typeface.DEFAULT_BOLD);
strokePaint.setStyle(Paint.Style.STROKE);
strokePaint.setStrokeWidth(2);
Paint textPaint = new Paint();
textPaint.setARGB(255, 255, 255, 255);
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setTextSize(16);
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
canvas.drawText("Some Text", 100, 100, strokePaint);
canvas.drawText("Some Text", 100, 100, textPaint);
super.draw(canvas, mapView, shadow);
}
Kenarlığı iki yöntemle ayarlayabilirsiniz. Biri çekilebilir ve ikincisi programatik.
<shape>
<solid android:color="@color/txt_white"/>
<stroke android:width="1dip" android:color="@color/border_gray"/>
<corners android:bottomLeftRadius="10dp"
android:bottomRightRadius="0dp"
android:topLeftRadius="10dp"
android:topRightRadius="0dp"/>
<padding android:bottom="0dip"
android:left="0dip"
android:right="0dip"
android:top="0dip"/>
</shape>
program niteliğinde
public static GradientDrawable backgroundWithoutBorder(int color) {
GradientDrawable gdDefault = new GradientDrawable();
gdDefault.setColor(color);
gdDefault.setCornerRadii(new float[] { radius, radius, 0, 0, 0, 0,
radius, radius });
return gdDefault;
}
Bulduğum en basit çözüm (ve aslında işe yarıyor):
<TextView
...
android:background="@android:drawable/editbox_background" />
Bir TextView çevresine kenarlık koymanın daha iyi bir yolunu buldum.
Arka plan için dokuz yamalı görüntü kullanın. It adlı oldukça basit, SDK 9-yama resim yapması için bir araç ile gelir ve kesinlikle gerektirir hiçbir kodlama.
Bağlantı http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch şeklindedir .
Kodunuza böyle bir şey ekleyebilirsiniz:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="#ffffff" />
<stroke android:width="1dip" android:color="#4fa5d5"/>
</shape>
Yuvarlatılmış köşeler yapmak için aşağıdaki bağlantıyı kontrol edin http://androidcookbook.com/Recipe.seam?recipeId=2318
Bir Android projesinde res altında çizilebilir klasör, bitmap'lerle (PNG veya JPG dosyaları) sınırlı değildir, ancak XML dosyalarında tanımlanan şekilleri de tutabilir.
Bu şekiller daha sonra projede tekrar kullanılabilir. Bir mizanpajın etrafına kenarlık koymak için şekil kullanılabilir. Bu örnek kavisli köşeleri olan dikdörtgen bir kenarlığı göstermektedir. Çizilebilir klasörde customborder.xml adlı yeni bir dosya oluşturulur (Eclipse'de Dosya menüsünü kullanın ve Dosya adında çizilebilir klasör seçiliyken Yeni'yi ve ardından Dosya'yı seçin ve Son'u tıklatın).
Kenarlık şeklini tanımlayan XML girilir:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="20dp"/>
<padding android:left="10dp" android:right="10dp" android:top="10dp" android:bottom="10dp"/>
<solid android:color="#CCCCCC"/>
</shape>
Özellik android:shape
dikdörtgene ayarlanmıştır (şekil dosyaları oval, çizgi ve halkayı da destekler). Dikdörtgen varsayılan değerdir, bu nedenle tanımlanmış bir dikdörtgense bu özellik dışarıda bırakılabilir. Şekil dosyası hakkında ayrıntılı bilgi için http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape adresindeki şekiller hakkındaki Android belgelerine bakın .
Öğe köşeleri, dikdörtgen köşeleri yuvarlanacak şekilde ayarlar. Her köşeye farklı bir yarıçap ayarlamak mümkündür (Android referansına bakın).
Doldurma nitelikleri, içeriğin kenarlıkla çakışmasını önlemek için, şeklin uygulandığı Görünümün içeriğini taşımak için kullanılır.
Buradaki kenarlık rengi açık gri olarak ayarlanmıştır (CCCCCC onaltılık RGB değeri).
Şekiller degradeleri de destekler, ancak bu burada kullanılmamaktadır. Yine, bir degradenin nasıl tanımlandığını görmek için Android kaynaklarına bakın. Şekil, mizanpaja kullanılarak uygulanır android:background="@drawable/customborder"
.
Düzen içinde diğer görünümler normal olarak eklenebilir. Bu örnekte, tek bir TextView eklenmiştir ve metin beyazdır (FFFFFF onaltılık RGB). Arka plan mavi, artı parlaklığı azaltmak için bir miktar saydamlığa ayarlandı (A00000FF onaltılık alfa RGB değeri). Son olarak, düzen, az miktarda dolgu ile başka bir düzene yerleştirilerek ekranın kenarından kaydırılır. Tam düzen dosyası şu şekildedir:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/customborder">
<TextView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Text View"
android:textSize="20dp"
android:textColor="#FFFFFF"
android:gravity="center_horizontal"
android:background="#A00000FF" />
</LinearLayout>
</LinearLayout>
Çok basit bir şekilde yapmanın bir yolu var ve paylaşmak istiyorum.
Ben mi TextViews kare istiyorum, ben sadece onları bir LinearLayout koyun. LinearLayout'umun arka plan rengini ayarladım ve TextView'ime bir kenar boşluğu ekliyorum. Sonuç, tıpkı TextView öğesinin karesini aldığınız gibidir.
Konstantin Burov cevabını değiştirmek benim durumumda çalışmıyor çünkü:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/white" />
<stroke android:width="2dip" android:color="#4fa5d5"/>
<corners android:radius="7dp"/>
</shape>
</item>
</selector>
compileSdkVersion 26 (Android 8.0), minSdkVersion 21 (Android 5.0), targetSdkVersion 26, 'com.android.support:appcompat-v7:26.1.0' uygulaması, not: 4.1
Metin görünümünüz için özel arka plan oluşturabilirsiniz. Adımlar 1. Projenize gidin. 2. Kaynaklara gidin ve çekilebilir için sağ tıklayın. 3. Yeni -> Çekilebilir Kaynak Dosyası'na tıklayın 4. Dosyanıza ad verin 5. Aşağıdaki kodu dosyaya yapıştırın
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:width="1dp" android:color="@color/colorBlack" />
<padding android:left="1dp"
android:top="1dp"
android:right="1dp"
android:bottom="1dp" />
<corners android:radius="6dp" />
<solid android:color="#ffffffff" />
Kağıt olarak kullanmak istediğiniz metin görünümünüz için,
robot: arka plan = "@ çekilebilir / dosya_adiniz"
İşte benim kenarlığı olan bir ImageView döndüren 'basit' yardımcı sınıfım. Bunu utils klasörünüze bırakın ve şöyle adlandırın:
ImageView selectionBorder = BorderDrawer.generateBorderImageView(context, borderWidth, borderHeight, thickness, Color.Blue);
İşte kod.
/**
* Because creating a border is Rocket Science in Android.
*/
public class BorderDrawer
{
public static ImageView generateBorderImageView(Context context, int borderWidth, int borderHeight, int borderThickness, int color)
{
ImageView mask = new ImageView(context);
// Create the square to serve as the mask
Bitmap squareMask = Bitmap.createBitmap(borderWidth - (borderThickness*2), borderHeight - (borderThickness*2), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(squareMask);
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
canvas.drawRect(0.0f, 0.0f, (float)borderWidth, (float)borderHeight, paint);
// Create the darkness bitmap
Bitmap solidColor = Bitmap.createBitmap(borderWidth, borderHeight, Bitmap.Config.ARGB_8888);
canvas = new Canvas(solidColor);
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
canvas.drawRect(0.0f, 0.0f, borderWidth, borderHeight, paint);
// Create the masked version of the darknessView
Bitmap borderBitmap = Bitmap.createBitmap(borderWidth, borderHeight, Bitmap.Config.ARGB_8888);
canvas = new Canvas(borderBitmap);
Paint clearPaint = new Paint();
clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawBitmap(solidColor, 0, 0, null);
canvas.drawBitmap(squareMask, borderThickness, borderThickness, clearPaint);
clearPaint.setXfermode(null);
ImageView borderView = new ImageView(context);
borderView.setImageBitmap(borderBitmap);
return borderView;
}
}
selectionBorder
?
Bu size yardımcı olabilir.
<RelativeLayout
android:id="@+id/textbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@android:color/darker_gray" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_margin="3dp"
android:background="@android:color/white"
android:gravity="center"
android:text="@string/app_name"
android:textSize="20dp" />
</RelativeLayout
Metin görünümünüzün kenarlığının rengi ve boyutu olarak arka plan rengiyle bir kenarlık görünümü oluşturun. kenarlık görünümü dolgusunu kenarlığın genişliği olarak ayarla. Metin görünümü arka plan rengini metin görünümü için istediğiniz renk olarak ayarlayın. Şimdi metin görünümünüzü kenarlık görünümünün içine ekleyin.
Bunu dene:
<shape>
<solid android:color="@color/txt_white"/>
<stroke android:width="1dip" android:color="@color/border_black"/>
</shape>
Bir textView'e kenarlık eklemenin birçok yolu vardır. En basit olanı, özel bir çizilebilir oluşturma ve bunu android:background="@drawable/textview_bg"
textView için olduğu gibi ayarlamanızdır .
Textview_bg.xml Çizilebilirlerin altına girer ve böyle bir şey olabilir. Köşe yarıçapı eklemek ve kenarlık eklemek için bir solid
veya gradient
arka plana (veya gerekli değilse hiçbir şeye) sahip olabilirsiniz .corners
stroke
textview_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:radius="@dimen/dp_10"/>
<gradient
android:angle="225"
android:endColor="#FFFFFF"
android:startColor="#E0E0E0" />
<stroke
android:width="2dp"
android:color="#000000"/>
</shape>
xml metin görünümünüzde setBackground,
rounded_textview.xml dosyasını çekilebilir dizininize ekleyin.
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@android:color/white" />
<stroke android:width="2dip" android:color="#4f5g52"/>
</shape>
çekilebilir dosyayı textView arka planda ayarla.
Aslında, çok basit. Metin görünümünün arkasında basit bir siyah dikdörtgen istiyorsanız, yalnızca android:background="@android:color/black"
TextView etiketlerinin içine ekleyin . Bunun gibi:
<TextView
android:textSize="15pt" android:textColor="#ffa7ff04"
android:layout_alignBottom="@+id/webView1"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:background="@android:color/black"/>