2012-11-05 33 views
7

Tôi đã mở rộng phạm vi tiêu chuẩn của các lớp Shape (RectShape, OvalShape và vv) bằng cách mở rộng lớp Shape để tạo bộ hình dạng tùy chỉnh của riêng mình. Ví dụ, tôi đã tạo ra một TriangleShape lớp đơn giản, như vậy:Tham chiếu một lớp Hình dạng tùy chỉnh trong XML

import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.drawable.shapes.Shape; 

public class TriangleLeftShape extends Shape { 

@Override 
public void draw(Canvas canvas, Paint paint) { 
    Path path = new Path(); 
    path.setLastPoint(0, getHeight()/2); 
    path.lineTo(getWidth(), getHeight()); 
    path.lineTo(getWidth(), 0); 
    path.close(); 
    canvas.drawPath(path, paint); 
    } 
} 

Những gì tôi muốn làm là tạo một nguồn tài nguyên Drawable hoàn toàn bằng XML sử dụng lớp này. Điều này có thể không?

Tôi biết rằng bằng một trong những hình dạng tiêu chuẩn chỉ đơn giản là đạt được bằng cách ví dụ sau đây, nơi mà các yếu tố <shape> đại diện cho một ShapeDrawable:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > 
<gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF" 
     android:angle="270"/> 
</shape> 

Những gì tôi không thể nhìn thấy là như thế nào ai có thể vượt qua, trong XML , một lớp tùy chỉnh Shape đến số ShapeDrawable này đang được định nghĩa trong XML. Tôi hiểu rằng thuộc tính android:shape chỉ đơn giản là chuyển một giá trị enum, chỉ có thể là hình chữ nhật, hình bầu dục, đường thẳng hoặc vòng. Dường như không có thuộc tính XML để chỉ định một lớp tùy chỉnh Shape.

Tuy nhiên, ShapeDrawable có phương thức setShape(), dường như đề xuất tôi có thể lập trình lớp tùy chỉnh Shape của mình, nhưng không thực hiện theo XML.

Làm cách nào, nếu có thể, tôi có thể sử dụng lớp học Shape tùy chỉnh trong XML không? Tôi nhận ra rằng tôi có thể tạo một hình tùy chỉnh View rất dễ dàng để vẽ các hình dạng cơ bản của mình, nhưng sử dụng Drawables dường như có lợi thế là có thể chỉ định màu sắc, v.v và các thuộc tính khác trong XML hoặc kiểu/chủ đề.

+0

mọi cập nhật về điều này? –

+1

@ M.ES Cuối cùng tôi đã làm nó theo chương trình. Tôi đi đến kết luận rằng những gì có thể được thực hiện thông qua XML là cố ý hạn chế, và chỉ cung cấp một tập con của những gì có thể được thực hiện thông qua các cuộc gọi phương thức. – Trevor

+0

Vâng, tôi 2 :) Thx! –

Trả lời

1

Bản vẽ tùy chỉnh không thể được tham chiếu từ xml, nhưng bạn có thể dễ dàng tạo lớp con có thể được sử dụng trong bố cục.

package com.example; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.text.Layout; 
import android.util.AttributeSet; 
import android.view.View; 


public class TextView extends android.view.TextView { 

    public TextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     setBackground(new MyCustomDrawable()); 
    }  
} 

và sử dụng nó trong Layout.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

    <com.example.TextView android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="my textview with custom drawable as background" 
    /> 

</FrameLayout> 

Bằng cách sử dụng thủ thuật này bạn có thể không chỉ đặt nền với drawable tùy chỉnh mà còn thiết lập drawables hợp chất (nó lớp có nguồn gốc từ TextView/Button)

Các vấn đề liên quan