Có thể vẽ một đường viền xung quanh một textview?
Có thể vẽ một đường viền xung quanh một textview?
Câu trả lời:
Bạn có thể đặt hình dạng có thể vẽ (hình chữ nhật) làm nền cho chế độ xem.
<TextView android:text="Some text" android:background="@drawable/back"/>
Và back.xml hình chữ nhật có thể vẽ được (đặt vào thư mục res / drawable):
<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>
Bạn có thể sử dụng @android:color/transparent
cho màu đơn sắc để có một nền trong suốt. Bạn cũng có thể sử dụng phần đệm để tách văn bản khỏi viền. để biết thêm thông tin, hãy xem: http://developer.android.com/guide/topics/resource/drawable-resource.html
Hãy để tôi tóm tắt một vài phương pháp khác nhau (không lập trình).
Lưu tệp dưới đây dưới dạng tệp XML trong thư mục có thể vẽ của bạn (ví dụ: 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>
Sau đó, chỉ cần đặt nó làm nền cho TextView của bạn:
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_border" />
Giúp đỡ nhiều hơn:
Một bản vá 9 là một hình ảnh nền có thể kéo dài. Nếu bạn tạo một hình ảnh với một đường viền thì nó sẽ cung cấp cho TextView của bạn một đường viền. Tất cả những gì bạn cần làm là tạo hình ảnh và sau đó đặt nó vào nền trong TextView của bạn.
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_ninepatch_image" />
Dưới đây là một số liên kết sẽ hiển thị cách tạo hình ảnh 9 miếng:
Sử dụng danh sách lớp
Bạn có thể sử dụng danh sách lớp để xếp chồng hai hình chữ nhật lên nhau. Bằng cách làm cho hình chữ nhật thứ hai chỉ nhỏ hơn một chút so với hình chữ nhật thứ nhất, bạn có thể tạo hiệu ứng viền. Hình chữ nhật đầu tiên (dưới) là màu viền và hình chữ nhật thứ hai là màu nền.
<?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>
Đặt android:top="2dp"
bù đắp đỉnh (làm cho nó nhỏ hơn) 2dp. Điều này cho phép hình chữ nhật đầu tiên (thấp hơn) hiển thị xuyên qua, tạo hiệu ứng viền. Bạn có thể áp dụng điều này cho nền TextView giống như cách mà shape
drawable đã được thực hiện ở trên.
Dưới đây là một số liên kết về danh sách lớp:
Sử dụng bản vá 9
Bạn chỉ có thể tạo một hình ảnh 9 miếng với một đường viền duy nhất. Mọi thứ khác giống như đã thảo luận ở trên.
Sử dụng Chế độ xem
Đây là một mẹo nhỏ nhưng nó hoạt động tốt nếu bạn cần thêm một ngăn cách giữa hai chế độ xem hoặc đường viền vào một TextView.
<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>
Dưới đây là một số liên kết khác:
border: 1px solid #999;
không phải là phức tạp này .
Cách đơn giản là thêm chế độ xem cho TextView của bạn. Ví dụ cho đường viền dưới cùng:
<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>
Đối với các đường viền hướng khác, vui lòng điều chỉnh vị trí của khung nhìn dải phân cách.
Tôi đã giải quyết vấn đề này bằng cách mở rộng textview và vẽ đường viền bằng tay. Tôi thậm chí đã thêm để bạn có thể chọn nếu một đường viền được chấm hoặc nét đứt.
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;
}
}
Và lớp biên giới:
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;
}
}
Hy vọng điều này sẽ giúp được ai đó :)
Tôi chỉ nhìn vào một câu trả lời tương tự-- nó có thể được thực hiện bằng Stroke và ghi đè sau:
@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);
}
Bạn có thể đặt đường viền bằng hai phương pháp. Một là bởi drawable và thứ hai là lập trình.
<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>
Lập trình
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;
}
Giải pháp đơn giản nhất tôi đã tìm thấy (và thực sự hoạt động):
<TextView
...
android:background="@android:drawable/editbox_background" />
Tôi đã tìm thấy một cách tốt hơn để đặt một đường viền xung quanh TextView.
Sử dụng một hình ảnh chín miếng cho nền. Điều này khá đơn giản, SDK đi kèm với một công cụ để tạo hình ảnh 9 bản vá và hoàn toàn không cần mã hóa.
Liên kết là http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch .
Bạn có thể thêm một cái gì đó như thế này trong mã của bạn:
<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>
Kiểm tra liên kết dưới đây để tạo các góc tròn http://androidcookbook.com/Recipe.seam?recipeId=2318
Thư mục drawable, dưới độ phân giải, trong dự án Android không bị giới hạn ở bitmap (tệp PNG hoặc JPG), nhưng nó cũng có thể giữ các hình dạng được xác định trong tệp XML.
Những hình dạng này sau đó có thể được tái sử dụng trong dự án. Một hình có thể được sử dụng để đặt một đường viền xung quanh một bố cục. Ví dụ này cho thấy một đường viền hình chữ nhật với các góc cong. Một tệp mới có tên customborder.xml được tạo trong thư mục drawable (trong Eclipse sử dụng menu File và chọn New rồi File, với loại thư mục drawable được chọn trong tên tệp và nhấn vào Kết thúc).
XML xác định hình dạng đường viền được nhập:
<?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>
Thuộc tính android:shape
được đặt thành hình chữ nhật (tệp hình dạng cũng hỗ trợ hình bầu dục, đường và vòng). Hình chữ nhật là giá trị mặc định, vì vậy thuộc tính này có thể bị bỏ qua nếu nó là hình chữ nhật được xác định. Xem tài liệu Android về hình dạng tại http://developer.android.com/guide/topics/resource/drawable-resource.html#Shape để biết thông tin chi tiết về tệp hình dạng.
Các góc phần tử đặt các góc hình chữ nhật được làm tròn. Có thể đặt bán kính khác nhau trên mỗi góc (xem tài liệu tham khảo Android).
Các thuộc tính đệm được sử dụng để di chuyển nội dung của Chế độ xem được áp dụng cho hình dạng, để ngăn nội dung chồng lên đường viền.
Màu đường viền ở đây được đặt thành màu xám nhạt (giá trị thập lục phân CCCCCC).
Hình dạng cũng hỗ trợ độ dốc, nhưng điều đó không được sử dụng ở đây. Một lần nữa, hãy xem tài nguyên Android để xem cách xác định độ dốc. Hình dạng được áp dụng cho bố cục sử dụng android:background="@drawable/customborder"
.
Trong bố cục, các khung nhìn khác có thể được thêm vào như bình thường. Trong ví dụ này, một TextView duy nhất đã được thêm vào và văn bản có màu trắng (FFFFFF hexadecimal RGB). Nền được đặt thành màu xanh lam, cộng với một số độ trong suốt để giảm độ sáng (giá trị alpha RGB thập lục phân A00000FF). Cuối cùng, bố cục được bù từ cạnh màn hình bằng cách đặt nó vào một bố cục khác với một lượng nhỏ phần đệm. Do đó, tập tin bố trí đầy đủ là:
<?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>
Tôi có một cách để làm điều đó rất đơn giản và tôi muốn chia sẻ nó.
Khi tôi muốn vuông mi TextViews, tôi chỉ cần đặt chúng vào linearLayout. Tôi đặt màu nền của linearLayout của mình và tôi thêm một lề vào TextView của mình. Kết quả chính xác như thể bạn bình phương TextView.
Thay đổi câu trả lời của Konstantin Burov vì không hoạt động trong trường hợp của tôi:
<?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, triển khai 'com.android.support:appcompat-v7:26.1.0', gradle: 4.1
Bạn có thể tạo nền tùy chỉnh cho chế độ xem văn bản của bạn. Các bước 1. Đi đến dự án của bạn. 2. Chuyển đến tài nguyên và nhấp chuột phải để vẽ. 3. Nhấp vào Mới -> Tệp tài nguyên có thể vẽ 4. Đặt tên cho tệp của bạn 5. Dán mã sau vào tệp
<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" />
Đối với chế độ xem văn bản của bạn, nơi bạn muốn sử dụng nó làm backgroud,
android: nền = "@ drawable / your_fileName"
Đây là lớp trình trợ giúp 'đơn giản' của tôi trả về ImageView có viền. Chỉ cần thả cái này vào thư mục utils của bạn và gọi nó như thế này:
ImageView selectionBorder = BorderDrawer.generateBorderImageView(context, borderWidth, borderHeight, thickness, Color.Blue);
Đây là mã.
/**
* 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
?
Điều này có thể giúp bạn.
<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
Tạo chế độ xem đường viền với màu nền là màu của đường viền và kích thước của chế độ xem văn bản của bạn. đặt phần đệm xem viền là chiều rộng của viền. Đặt màu nền của chế độ xem văn bản làm màu bạn muốn cho chế độ xem văn bản. Bây giờ thêm chế độ xem văn bản của bạn bên trong chế độ xem viền.
Thử cái này:
<shape>
<solid android:color="@color/txt_white"/>
<stroke android:width="1dip" android:color="@color/border_black"/>
</shape>
Có rất nhiều cách để thêm đường viền vào textView. Cách đơn giản nhất là bằng cách tạo một drawable tùy chỉnh và đặt nó như android:background="@drawable/textview_bg"
cho textView của bạn.
Textview_bg.xml sẽ nằm trong Drawables và có thể giống như thế này. Bạn có thể có một solid
hoặc một gradient
nền (hoặc không có gì nếu không cần thiết), corners
để thêm bán kính góc và stroke
thêm đường viền.
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>
setBackground trên textview xml của bạn,
thêm tệp round lòngviewview vào thư mục drawable của bạn.
<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>
đặt tập tin drawable trong nền textView.
Thật ra, nó rất đơn giản. Nếu bạn muốn một hình chữ nhật màu đen đơn giản phía sau Textview, chỉ cần thêm vào android:background="@android:color/black"
trong các thẻ TextView. Như thế này:
<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"/>