我正在製作一個應用程序,該應用程序使用3個SeekBars以允許用戶創建RGB顏色。然後,我想使用WallpaperManager將此顏色設置爲背景。如何從RGB顏色創建位圖
如果我有3個值,一個用於紅色,一個用於綠色,另一個用於藍色,有沒有辦法創建一個只用一種顏色填充的方形位圖?
我正在製作一個應用程序,該應用程序使用3個SeekBars以允許用戶創建RGB顏色。然後,我想使用WallpaperManager將此顏色設置爲背景。如何從RGB顏色創建位圖
如果我有3個值,一個用於紅色,一個用於綠色,另一個用於藍色,有沒有辦法創建一個只用一種顏色填充的方形位圖?
你可以這樣做,用選定的顏色創建一個平方位圖。
// 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);
這是我創建的使用自定義視圖的示例項目。此自定義視圖具有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>
使用Android Studio創建最小API級別15.請記住更改seekbar上的值映射從0-255,當前爲0-99。