2015-02-01 6 views
8

chcę stworzyć to, używając przycisku (TextView) za pomocą XML Definition:Android: Dodać przycisk w kształcie trójkąta z wykorzystaniem definicji XML (rozciągliwych)

my image

W układzie Aktywności mam:

<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" /> 

założyłem kilka stanowisk:

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

Android triangle (arrow) defined as an XML shape

lub Android - make an arrow shape with xml

Próbowałem zmodyfikować kilka definicji XML, ale nic nie było dobre. Czy jest jakiś prosty sposób na wdrożenie tego kształtu? Powinien również mieć przezroczyste tło.

+0

kształty xnl nie są "uniwersalnym" sposobem zadeklarowania wszystkich potrzebnych rysunków, spróbuj pisać swoje własne android.graphics.drawable.shapes.Shape i użyj go z ShapeDrawable – pskink

Odpowiedz

8

Jeśli ktoś nadal ma problemy z tym:

  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. przesłanianie TextView i używać go w układ:

    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); 
    
    
        } 
    } 
    

Odnośnie przykładu xml: istnieją dwa prostokąty overlapping.You mają się bawić z wartościami dużo, a to sprawia, że ​​trudno używać w różnych widokach. Myślę, że używanie niestandardowego widoku jest najlepszym rozwiązaniem w tym przypadku.

+0

Czasami po prostu musisz się załamać i zrobić niestandardowy Widok. Dzięki za wykonanie ładnego i prostego przykładu. –

+0

ale wygląda na to, że właściwość Text zostanie utracona, jeśli użyjemy Twojego kodu! – Oussaki

+0

Po prostu umieść super.onDraw (canvas); wywołanie na końcu metody onDraw, dzięki czemu kod ten będzie działał poprawnie – 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> 

Powiązane problemy