Comment faire une ligne pointillée / pointillée dans Android?

J'essaie de faire une ligne pointillée. Je l'utilise maintenant pour une ligne solide:

LinearLayout divider = new LinearLayout( this ); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, 2 ); divider.setLayoutParams( params ); divider.setBackgroundColor( getResources().getColor( R.color.grey ) ); 

J'ai besoin de quelque chose comme ça, mais pointillé plutôt que solide. Je voudrais éviter de faire des centaines de mises en page alternant entre une disposition transparente et une mise en page solide.

  • Session 'application': erreur Activation de lancement
  • Paiement Paypal: comment obtenir une demande de réussite lors du chargement du paypal dans la visualisation web
  • Pourquoi la reprise d'une activité dans Android cause-t-elle BadTokenException?
  • Android: Obtenez tous les PendingIntents configurés avec AlarmManager
  • SpannableString: Est-il possible d'appliquer deux ou plusieurs versions relatives?
  • Comment insérer le texte "<<" dans TextView?
  • 10 Solutions collect form web for “Comment faire une ligne pointillée / pointillée dans Android?”

    Sans code java:

    Drawable / dotted.xml:

     <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line"> <stroke android:color="#C7B299" android:dashWidth="10px" android:dashGap="10px" android:width="1dp"/> </shape> 

    View.xml:

     <ImageView android:layout_width="match_parent" android:layout_height="5dp" android:src="@drawable/dotted" android:layerType="software" /> 

    L'effet de chemin est défini sur l'objet de peinture

     Paint fgPaintSel = new Paint(); fgPaintSel.setARGB(255, 0, 0,0); fgPaintSel.setStyle(Style.STROKE); fgPaintSel.setPathEffect(new DashPathEffect(new float[] {10,20}, 0)); 

    Vous pouvez créer toutes sortes de motifs en pointillés en fournissant plus de nombres dans le tableau int [], il spécifie les rapports de tiret et d'intervalle. C'est une ligne simple, également pointillée.

    Cela vous aidera. Création de lignes pointillées à l'aide de XML. Créez xml dans un dossier dessiné et donnez ce fond à l'élément auquel vous souhaitez définir une bordure pointillée.

    —-> Création d'un fond d'écran XML "dashed_border"

     <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape> <solid android:color="#ffffff" /> <stroke android:dashGap="5dp" android:dashWidth="5dp" android:width="1dp" android:color="#0000FF" /> <padding android:bottom="5dp" android:left="5dp" android:right="5dp" android:top="5dp" /> </shape> </item> </layer-list> 

    —–> Ajout de ce fond à l'élément

     <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/dashed_border"/> 

    Créer xml (view_line_dotted.xml):

     <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:bottom="-1dp" android:left="-1dp" android:right="-1dp" android:top="0dp"> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="#ffff0017" android:dashGap="3dp" android:dashWidth="1dp" /> <solid android:color="@android:color/transparent" /> <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> </shape> </item> </layer-list> 

    Définissez en arrière-plan votre vue:

     <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@drawable/view_line_dotted" /> 

    Ce que j'ai fait lorsque je voulais dessiner une ligne en pointillé, c'est de définir un dessinable dash_line.xml :

     <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line" > <stroke android:dashGap="3dp" android:dashWidth="2dp" android:width="1dp" android:color="@color/black" /> </shape> 

    Ensuite, dans la mise en page, définissez simplement une vue avec l'arrière-plan en tant que dash_line . Remarque pour inclure Android: layerType = "logiciel" , sinon cela ne fonctionnera pas.

     <View android:layout_width="match_parent" android:layout_height="5dp" android:background="@drawable/dash_line" android:layerType="software" /> 

    J'ai personnalisé un dashline qui supporte la ligne horizontale et verticale des tirets. Code ci-dessous:

     public class DashedLineView extends View { private float density; private Paint paint; private Path path; private PathEffect effects; public DashedLineView(Context context) { super(context); init(context); } public DashedLineView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public DashedLineView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } private void init(Context context) { density = DisplayUtil.getDisplayDensity(context); paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(density * 4); //set your own color paint.setColor(context.getResources().getColor(R.color.XXX)); path = new Path(); //array is ON and OFF distances in px (4px line then 2px space) effects = new DashPathEffect(new float[] { 4, 2, 4, 2 }, 0); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setPathEffect(effects); int measuredHeight = getMeasuredHeight(); int measuredWidth = getMeasuredWidth(); if (measuredHeight <= measuredWidth) { // horizontal path.moveTo(0, 0); path.lineTo(measuredWidth, 0); canvas.drawPath(path, paint); } else { // vertical path.moveTo(0, 0); path.lineTo(0, measuredHeight); canvas.drawPath(path, paint); } } } 

    J'ai utilisé ci-dessous un arrière-plan pour la mise en page:

     <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="1dp" android:dashWidth="10px" android:dashGap="10px" android:color="android:@color/black" /> </shape> 

    En utilisant cette classe, vous pouvez appliquer l'effet «pointillé et souligné» à plusieurs lignes de texte. Pour utiliser DashPathEffect, vous devez éteindre le hardwareAccelerated de votre TextView (bien que la méthode DashPathEffect ait un problème avec le texte long). Vous pouvez trouver mon exemple de projet ici: https://github.com/jintoga/Dashed-Underlined-TextView/blob/master/Untitled.png .

    Classe publique: la commande de ligne en ligne de LineUnderlineSpan Line LineBackgroundSpan, LineHeightSpan {

     private Paint paint; private TextView textView; private float offsetY; private float spacingExtra; public DashedUnderlineSpan(TextView textView, int color, float thickness, float dashPath, float offsetY, float spacingExtra) { this.paint = new Paint(); this.paint.setColor(color); this.paint.setStyle(Paint.Style.STROKE); this.paint.setPathEffect(new DashPathEffect(new float[] { dashPath, dashPath }, 0)); this.paint.setStrokeWidth(thickness); this.textView = textView; this.offsetY = offsetY; this.spacingExtra = spacingExtra; } @Override public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, Paint.FontMetricsInt fm) { fm.ascent -= spacingExtra; fm.top -= spacingExtra; fm.descent += spacingExtra; fm.bottom += spacingExtra; } @Override public void drawBackground(Canvas canvas, Paint p, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum) { int lineNum = textView.getLineCount(); for (int i = 0; i < lineNum; i++) { Layout layout = textView.getLayout(); canvas.drawLine(layout.getLineLeft(i), layout.getLineBottom(i) - spacingExtra + offsetY, layout.getLineRight(i), layout.getLineBottom(i) - spacingExtra + offsetY, this.paint); } } 

    }

    résultat

    Utilisez un ShapeDrawable au lieu d'un LinearLayout et jouez avec dashWidth et dashGap

    http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

    Je ne sais pas pourquoi, mais les réponses votées ne fonctionnent pas pour moi. Je l'écris de cette façon et fonctionne bien.
    Définissez une vue personnalisée:

     public class XDashedLineView extends View { private Paint mPaint; private Path mPath; private int vWidth; private int vHeight; public XDashedLineView(Context context) { super(context); init(); } public XDashedLineView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public XDashedLineView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(); mPaint.setColor(Color.parseColor("#3F577C")); mPaint.setStyle(Paint.Style.STROKE); mPaint.setPathEffect(new DashPathEffect(new float[] {10,10}, 0)); mPath = new Path(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); this.vWidth = getMeasuredWidth(); this.vHeight = getMeasuredHeight(); mPath.moveTo(0, this.vHeight / 2); mPath.quadTo(this.vWidth / 2, this.vHeight / 2, this.vWidth, this.vHeight / 2); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(mPath, mPaint); } } 

    Ensuite, vous pouvez l'utiliser dans votre xml:

      <com.YOUR_PACKAGE_NAME.XDashedLineView android:layout_width="690dp" android:layout_height="1dp" android:layout_marginLeft="30dp" android:layout_marginTop="620dp"/> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.