2011-02-09 15 views
15

Tôi đang thử nghiệm với nền có thể vẽ và không có vấn đề gì cho đến nay.Thay đổi màu nền gradient trên Android khi đang chạy

Tôi hiện đang cố gắng thay đổi màu nền gradient khi chạy.

Thật không may, không có API để thay đổi nó khi chạy, có vẻ như vậy. Không, ngay cả bằng cách cố gắng biến đổi() có thể vẽ được, như được giải thích tại đây: Drawable mutations

XML mẫu trông như thế này. Nó hoạt động, như mong đợi.

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient 
     android:startColor="#330000FF" 
     android:endColor="#110000FF" 
     android:angle="90"/> 
</shape> 

Đáng buồn thay, tôi muốn có một danh sách với màu sắc khác nhau, và họ sẽ phải được thay đổi programatically khi chạy.

Có cách nào khác để tạo nền gradient này khi chạy không? Có lẽ thậm chí không sử dụng XML hoàn toàn?

Trả lời

32

Có! Tìm cách!

Đã phải quên về XML, nhưng đây là cách tôi đã làm nó:

On getView của tôi() chức năng quá tải (ListAdapter) Tôi chỉ phải:

int h = v.getHeight(); 
    ShapeDrawable mDrawable = new ShapeDrawable(new RectShape()); 
    mDrawable.getPaint().setShader(new LinearGradient(0, 0, 0, h, Color.parseColor("#330000FF"), Color.parseColor("#110000FF"), Shader.TileMode.REPEAT)); 
    v.setBackgroundDrawable(mDrawable); 

Và đó đã cho tôi cùng một kết quả làm nền XML ở trên. Bây giờ tôi có thể thiết lập màu nền cho chương trình.

+2

Có thể đưa ra giá trị góc trên không? – Ahmed

+1

Nếu bạn đang sử dụng tính năng này trong một hoạt động, bạn có thể muốn chạy điều này, ví dụ: trong onWindowFocusChanges() thay vì onCreate(). –

0

Tùy thuộc vào yêu cầu của bạn, sử dụng color state list thay vì màu cố định cho startColor và endColor có thể làm những gì bạn muốn.

+0

Thú vị thay thế, nhưng tôi thực sự cần một cái gì đó năng động hơn. Đó là danh sách hiển thị thông tin từ các nhà cung cấp pluggable khác nhau. Mỗi nhà cung cấp có một màu tùy chỉnh, do đó người dùng biết được thông tin đó từ đâu. Tôi biết rằng không có nhiều thông tin, nhưng có lẽ nó sẽ giúp ích. – Phenome

9

Tôi đã thử sử dụng giải pháp của Phenome cho chế độ xem Nút. Nhưng bằng cách nào đó nó không hoạt động.

tôi đã đưa ra một cái gì đó khác: (Courtesy: Android ví dụ API Demo)

package com.example.testApp; 

import android.app.Activity; 
import android.graphics.drawable.GradientDrawable; 
import android.os.Bundle; 
import android.view.View; 

public class TetApp extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     View v = findViewById(R.id.btn); 
     v.setBackgroundDrawable(new DrawableGradient(new int[] { 0xff666666, 0xff111111, 0xffffffff }, 0).SetTransparency(10)); 

    } 

    public class DrawableGradient extends GradientDrawable { 
     DrawableGradient(int[] colors, int cornerRadius) { 
      super(GradientDrawable.Orientation.TOP_BOTTOM, colors); 

      try { 
       this.setShape(GradientDrawable.RECTANGLE); 
       this.setGradientType(GradientDrawable.LINEAR_GRADIENT); 
       this.setCornerRadius(cornerRadius); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     public DrawableGradient SetTransparency(int transparencyPercent) { 
      this.setAlpha(255 - ((255 * transparencyPercent)/100)); 

      return this; 
     } 
    } 
} 
0

Hãy thử mã của tôi dưới đây:

int[] colors = new int[2]; 
      colors[0] = getRandomColor(); 
      colors[1] = getRandomColor(); 


      GradientDrawable gd = new GradientDrawable(
        GradientDrawable.Orientation.TOP_BOTTOM, colors); 

      gd.setGradientType(GradientDrawable.RADIAL_GRADIENT); 
      gd.setGradientRadius(300f); 
      gd.setCornerRadius(0f); 
      YourView.setBackground(gd); 

Phương pháp để tạo ra màu sắc ngẫu nhiên:

public static int getRandomColor(){ 
    Random rnd = new Random(); 
    return Color.argb(255, rnd.nextInt(256), rnd.nextInt(56), rnd.nextInt(256)); 
}