2015-02-01 4 views
8

ich erstellen möchten diese mit der Taste (Textview) von XML definiton mit:Android: Machen Sie eine Schaltfläche mit Dreiecksform mit Hilfe von XML-Definitionen (ziehbar)

my image

Im Layout der Aktivität Ich habe:

<TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/button_arrow" <!-- I NEED IMPLEMENT THIS --> 
     android:clickable="true" 
     android:drawablePadding="7dp" 
     android:gravity="center" 
     android:drawableLeft="@drawable/music_cloud" 
     android:onClick="exportSong" 
     android:padding="20dp" 
     android:text="@string/export_upload" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@color/dark_yellow_text_color" 
     android:textStyle="bold" /> 

ich gründete mehrere Beiträge:

making-a-triangle-shape-using-xml-definitions

Android triangle (arrow) defined as an XML shape

oder Android - make an arrow shape with xml

versuchte ich mehrere XML-Definition ändern aber nichts war gut. Gibt es einen einfachen Weg, diese Form zu implementieren? Auch sollte es einen transparenten Hintergrund haben.

+0

xnl shapes sind keine "general purpose" Möglichkeit, alle Zeichensätze zu deklarieren, die man braucht, versuche deine eigene android.graphics.drawable.shapes.Shape zu schreiben und benutze sie mit einem ShapeDrawable – pskink

Antwort

8

Wenn jemand noch Probleme mit diesem hat:

  1. xml:

    <item android:top="45dp"> 
        <shape> 
         <size android:height="100dp" android:width="90dp"/> 
         <solid android:color="@android:color/holo_orange_light" /> 
        </shape> 
    </item> 
    <item android:top="36dp" android:left="11dp"> 
        <rotate 
         android:fromDegrees="45" 
         android:toDegrees="0" 
         android:pivotX="80%" 
         android:pivotY="20%" > 
         <shape> 
          <size android:width="40dp" 
           android:height="30dp"/> 
          <stroke android:color="@android:color/holo_orange_light" android:width="1dp"/> 
          <solid android:color="@android:color/holo_orange_light" /> 
         </shape> 
        </rotate> 
    </item> 
    </layer-list> 
    
  2. Überschreibung Textview und verwenden Sie es in Ihrem Layout:

    public class CustomTextView extends TextView { 
    
        private int mWidth; 
        private int mHeight; 
    
    
        public CustomTextView(Context context, AttributeSet attrs) { 
         super(context, attrs); 
    
        } 
    
        @Override 
        protected void onDraw(Canvas canvas) { 
    
         super.onDraw(canvas); 
         Paint mPaint = new Paint(); 
         int color = getResources().getColor(R.color.YourColor); 
    
         mPaint.setColor(color); 
         Path mPath = new Path(); 
         mPath.moveTo(.0f, this.getHeight()); 
         mPath.lineTo(0.8f * this.getWidth(), this.getHeight()); 
         mPath.lineTo(this.getWidth(), 0.5f * this.getHeight()); 
         mPath.lineTo(0.8f * this.getWidth(), .0f); 
         mPath.lineTo(.0f, .0f); 
         mPath.lineTo(.0f, this.getHeight()); 
    
         canvas.clipPath(mPath); 
         canvas.drawPath(mPath,mPaint); 
    
    
        } 
    } 
    

In Bezug auf die XML-Beispiel: Es gibt zwei Rechtecke overlapping.You viel mit den Werten spielen um, und dies macht es schwierig, Verwenden Sie verschiedene Ansichten. Ich denke, dass die Verwendung einer benutzerdefinierten Ansicht in diesem Fall die beste Lösung ist.

+0

Manchmal musst du nur zusammenbrechen und einen Brauch machen Aussicht. Danke, dass Sie ein schönes und einfaches Beispiel gemacht haben. –

+0

aber scheint wie der Text Eigenschaft wird verloren, wenn wir Ihren Code verwenden! – Oussaki

+0

Setzen Sie einfach super.onDraw (Leinwand); Aufruf am Ende der onDraw-Methode, so dass dieser Code ordnungsgemäß funktioniert – Oussaki

0

<item> 
    <inset android:insetBottom="2dp" > 
     <selector xmlns:android="http://schemas.android.com/apk/res/android" > 
      <item android:state_pressed="true"> 
       <shape android:shape="rectangle" > 
        <corners android:radius="3dip" /> 

        <stroke 
         android:width="1dip" 
         android:color="#5e7974" /> 

        <gradient 
         android:angle="-90" 
         android:centerColor="#ECEFF1" 
         android:endColor="#FFAB00" 
         android:startColor="#FFAB00" /> 
       </shape> 
      </item> 
      <item android:state_focused="true"> 
       <shape android:shape="rectangle" > 
        <corners android:radius="3dip" /> 

        <stroke 
         android:width="1dip" 
         android:color="#5e7974" /> 

        <gradient 
         android:angle="-90" 
         android:centerColor="#ECEFF1" 
         android:endColor="#FFAB00" 
         android:startColor="#FFAB00" /> 
       </shape> 
      </item> 
      <item> 
       <shape android:shape="rectangle" > 
        <corners android:radius="3dip" /> 

        <stroke 
         android:width="1dip" 
         android:color="#5e7974" /> 

        <gradient 
         android:angle="-90" 
         android:centerColor="#ECEFF1" 
         android:endColor="#FFD600" 
         android:startColor="#FFD600" /> 
       </shape> 
      </item> 
     </selector> 
    </inset> 
</item> 
<item 
    android:bottom="65dp" 
    android:right="-129dp" 
    android:top="-40dp"> 
    <rotate android:fromDegrees="50" > 
     <shape android:shape="rectangle" > 
      <solid android:color="@color/background_color_light_yellow" /> 
     </shape> 
    </rotate> 
</item> 
<item 
    android:bottom="-40dp" 
    android:right="-129dp" 
    android:top="65dp"> 
    <rotate android:fromDegrees="-50" > 
     <shape android:shape="rectangle" > 
      <solid android:color="@color/background_color_light_yellow" /> 
     </shape> 
    </rotate> 
</item>