Custom TextView with triangle arrow and triangle arrow textview
<? Xml version = "1.0" encoding = "UTF-8"?>
<Resources>
<Declare-styleable name = "ArrowTextView">
<Attr name = "radius" format = "dimension"/>
<Attr name = "arrowWidth" format = "dimension"/>
<Attr name = "arrowInHeight" format = "dimension"/>
<Attr name = "bg" format = "color"/>
</Declare-styleable>
</Resources>
Package com. example. sanjjiaoxing;
Import android. content. Context;
Import android. content. res. TypedArray;
Import android. graphics. Canvas;
Import android. graphics. Color;
Import android. graphics. Paint;
Import android. graphics. Path;
Import android. graphics. RectF;
Import android. util. AttributeSet;
Import android. util. TypedValue;
Import android. view. View;
Import android. widget. LinearLayout;
Import android. widget. TextView;
/**
* @ Author wuxif_000 the arrow with a triangle (the triangle is centered at a certain height and beyond this height, regardless of ......). The four corners have rounded corners,
*
*/
Public class ArrowTextView extends TextView {
Public ArrowTextView (Context context, AttributeSet attrs ){
Super (context, attrs );
Ini (context, attrs );
}
Private void ini (Context context, AttributeSet attrs ){
TypedArray typedArray = context. obtainStyledAttributes (attrs, R. styleable. ArrowTextView );
Radius = typedArray. getDimension (R. styleable. ArrowTextView_radius, 0 );
ArrowWidth = typedArray. getDimension (R. styleable. ArrowTextView_arrowWidth, 0 );
ArrowInHeight = typedArray. getDimension (R. styleable. ArrowTextView_arrowInHeight, 0 );
Color = typedArray. getColor (R. styleable. ArrowTextView_bg, Color. RED );
}
Public ArrowTextView (Context context, AttributeSet attrs, int defStyle ){
Super (context, attrs, defStyle );
Ini (context, attrs );
}
Public ArrowTextView (Context context ){
Super (context );
}
Private float radius;
Private float arrowWidth;
/**
* The triangle arrow is centered at this height ......
*/
Private float arrowInHeight;
Private int color;
/**
* @ Param arrowWidth width of the triangle arrow .......
*/
Public void setArrowWidth (float arrowWidth ){
This. arrowWidth = arrowWidth;
Invalidate ();
}
/**
* @ Param arrowInHeight the triangle arrow centered at this height ......
*/
Public void setArrowInHeight (float arrowInHeight ){
This. arrowInHeight = arrowInHeight;
Invalidate ();
}
/**
* @ Param radius the radius of the rounded corner of the rectangle ..........
*/
Public void setRadius (float radius ){
This. radius = radius;
Invalidate ();
}
/**
* @ Param color the background color of the arrow rectangle .........
*/
Public void setBgColor (int color ){
This. color = color;
Invalidate ();
}
@ Override
Protected void onDraw (Canvas canvas ){
Paint paint = new Paint ();
Paint. setColor (color = 0? Color. RED: color );
Paint. setAntiAlias (true );
If (radius = 0 ){
Radius = TypedValue. applyDimension (TypedValue. COMPLEX_UNIT_DIP, 5, getResources (). getDisplayMetrics ());
}
If (arrowWidth = 0 ){
ArrowWidth = TypedValue. applyDimension (TypedValue. COMPLEX_UNIT_DIP, 10, getResources (). getDisplayMetrics ());
}
// Rectangle with rounded corners (left minus the width of the triangle ...........)
Int left = (int) (getPaddingLeft ()-arrowWidth );
Int height = getHeight ();
Canvas. drawRoundRect (new RectF (left, 0, getWidth (), height), radius, radius, paint );
If (arrowInHeight = 0 ){
ArrowInHeight = TypedValue. applyDimension (TypedValue. COMPLEX_UNIT_DIP, 50, getResources (). getDisplayMetrics ());
}
Height = (int) (height> arrowInHeight? ArrowInHeight: height );
// Draw a triangle
Path path = new Path ();
Path. setFillType (Path. FillType. EVEN_ODD );
Float yMiddle = height/2;
Float yTop = yMiddle-(arrowWidth/2 );
Float yBottom = yMiddle + (arrowWidth/2 );
Path. moveTo (0, yMiddle );
Path. lineTo (left, yTop );
Path. lineTo (left, yBottom );
Path. lineTo (0, yMiddle );
Path. close ();
Canvas. drawPath (path, paint );
// Canvas. restore ();
// Canvas. translate (left, 0 );
Super. onDraw (canvas );
}
}
// Usage
<Com. example. sanjjiaoxing. ArrowTextView
Android: id = "@ + id/arrowText"
Android: layout_width = "match_parent"
Android: layout_height = "wrap_content"
Android: layout_alignParentRight = "true"
Android: layout_below = "@ + id/textView1"
Android: layout_marginTop = "63dp"
Android: paddingBottom = "10dp"
Android: paddingLeft = "15dp"
Android: paddingRight = "10dp"
Android: paddingTop = "10dp"
Android: text = "qqqqqqqqqqqqddddddsdfsfdfdfddddfdsfdfdfdfdfdfdfdfdddddddddddddddddqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqq"
Wuxifu: bg = "@ color/green"
Wuxifu: radius = "10dp"/>