2016-04-25 165 views
1

我正在製作一個應用程序,該應用程序使用3個SeekBars以允許用戶創建RGB顏色。然後,我想使用WallpaperManager將此顏色設置爲背景。如何從RGB顏色創建位圖

如果我有3個值,一個用於紅色,一個用於綠色,另一個用於藍色,有沒有辦法創建一個只用一種顏色填充的方形位圖?

回答

2

你可以這樣做,用選定的顏色創建一個平方位圖。

// Here you create the bound of your shape 
Rect rect = new Rect(0, 0, 1, 1); 

// You then create a Bitmap and get a canvas to draw into it 
Bitmap image = Bitmap.createBitmap(rect.width(), rect.height(), Config.ARGB_8888); 
Canvas canvas = new Canvas(image); 

//You can get an int value representing an argb color by doing so. Put 1 as alpha by default 
int color = Color.argb(alpha, red, green, blue); 

//Paint holds information about how to draw shapes 
Paint paint = new Paint(); 
paint.setColor(color); 

// Then draw your shape 
canvas.drawRect(rect, paint); 
1

這是我創建的使用自定義視圖的示例項目。此自定義視圖具有setColor()方法,當您更改搜索欄時,將分別傳遞RGB值,顏色會更新。當按鈕被點擊時,它會生成位圖。從github下載完整project here。有一件事是缺失的,最大的seekbar值爲100,你應該將其映射到0-255,以利用所有可能的顏色組合。

現在,無論何時更改seekbar,它都會在運行時改變顏色。由於這是一項有趣的工作,因此值得投入我的時間。您還可以創建jpeg文件以允許用戶使用該文件,refer here。下面是源代碼:

MainActivity:

public class MainActivity extends AppCompatActivity { 

    SeekBar skRed; 
    SeekBar skGreen; 
    SeekBar skBlue; 


    RgbView myView ; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     skRed=(SeekBar) findViewById(R.id.redBar); 
     skGreen=(SeekBar) findViewById(R.id.greenBar); 
     skBlue=(SeekBar) findViewById(R.id.blueBar); 
     myView = (RgbView) findViewById(R.id.customView); 

     myView = (RgbView) findViewById(R.id.customView); 

     // This is sample color combination replace with your seekbar values 

     Button colorChange=(Button) findViewById(R.id.button); 

     colorChange.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


       // Bitmap creation code 
       myView.setDrawingCacheEnabled(true); 

       myView.buildDrawingCache(); 


       // bm is your required bitmap 
       Bitmap bm = myView.getDrawingCache(); 

       Toast.makeText(MainActivity.this,"Bitmap Ready",Toast.LENGTH_LONG).show(); 

      } 
     }); 


     skRed.setOnSeekBarChangeListener(changeListener); 
     skGreen.setOnSeekBarChangeListener(changeListener); 
     skBlue.setOnSeekBarChangeListener(changeListener); 
    } 

    SeekBar.OnSeekBarChangeListener changeListener=new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 


    // calling setColor() of custom view , passing current seekbar values from 3 seekbars 

    myView.setColor(skRed.getProgress(),skGreen.getProgress(),skBlue.getProgress()); 


      } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }; 


} 

CustomView:RgbView.java

public class RgbView extends View { 

    Paint p=new Paint(); 
    public RgbView(Context context) { 
     super(context); 
     init(null, 0); 
    } 

    public RgbView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(attrs, 0); 
    } 

    public RgbView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(attrs, defStyle); 
    } 

    private void init(AttributeSet attrs, int defStyle) { 
     p.setColor(Color.RED); 
    } 

    public void setColor(int Red, int Green, int Blue) 
    { 

     p.setARGB(255, Red, Green, Blue); 
     invalidate(); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     canvas.drawRect(0,0, getHeight(),getWidth(),p); 
    } 



} 

XML爲MainActivity:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.talha.projects.bitmaptest.MainActivity"> 

    <com.talha.projects.bitmaptest.RgbView 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 
     android:id="@+id/customView"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Load into Bitmap" 
     android:id="@+id/button" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" /> 

    <SeekBar 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:id="@+id/redBar" 

     android:layout_below="@+id/customView" 
     android:layout_alignRight="@+id/customView" 
     android:layout_alignEnd="@+id/customView" /> 

    <SeekBar 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:id="@+id/greenBar" 
     android:layout_below="@+id/redBar" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

    <SeekBar 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:id="@+id/blueBar" 
     android:layout_below="@+id/greenBar" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 
</RelativeLayout> 

這裏是輸出: enter image description here

Link to project

使用Android Studio創建最小API級別15.請記住更改seekbar上的值映射從0-255,當前爲0-99。