package yuku.ambilwarna; import android.app.AlertDialog; import android.app.Dialog; import android.content.*; import android.graphics.Color; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.style.BackgroundColorSpan; import android.text.style.ForegroundColorSpan; import android.util.Log; import android.view.*; import android.view.View.OnClickListener; import android.widget.*; public class AmbilWarnaDialog { private static final String TAG = AmbilWarnaDialog.class.getSimpleName(); public interface OnAmbilWarnaListener { void onCancel(); void onOk(int bgColor,int fgColor); } Dialog dialog; OnAmbilWarnaListener listener; View viewHue; AmbilWarnaKotak viewKotak; ImageView panah; TextView preview; private int mTextColor=0xFF000000; private int mBgColor=0xFFFFFFFF; RadioButton bgSelector; RadioButton fgSelector; ImageView viewKeker; float satudp; int warnaLama; int warnaBaru; float hue; float sat; float val; float ukuranUiDp = 230.f; float ukuranUiPx; // diset di constructor private SpannableStringBuilder previewSB; public AmbilWarnaDialog(Context context, int color,int bgcolor, final OnAmbilWarnaListener listener) { this.listener = listener; this.warnaLama = color; this.warnaBaru = color; Color.colorToHSV(color, tmp01); hue = tmp01[0]; sat = tmp01[1]; val = tmp01[2]; satudp = context.getResources().getDimension(R.dimen.ambilwarna_satudp); Log.d(TAG, "satudp = " + satudp + ", ukuranUiPx=" + ukuranUiPx); //$NON-NLS-1$//$NON-NLS-2$ View view = LayoutInflater.from(context).inflate(R.layout.ambilwarna_dialog, null); ukuranUiPx = ukuranUiDp * satudp; ukuranUiDp=view.findViewById(R.id.ambilwarna_viewKotak).getHeight(); viewHue = view.findViewById(R.id.ambilwarna_viewHue); viewKotak = (AmbilWarnaKotak) view.findViewById(R.id.ambilwarna_viewKotak); panah = (ImageView) view.findViewById(R.id.ambilwarna_panah); preview = (TextView) view.findViewById(R.id.preview); bgSelector=(RadioButton) view.findViewById(R.id.bgcolor); fgSelector=(RadioButton) view.findViewById(R.id.fgcolor); ((Button) view.findViewById(R.id.setcolor)).setOnClickListener(new OnClickListener() { public void onClick(View v) { listener.onOk(mBgColor,mTextColor); dialog.dismiss(); } }); ((Button) view.findViewById(R.id.cancel)).setOnClickListener(new OnClickListener() { public void onClick(View v) { listener.onCancel(); dialog.dismiss(); } }); RadioGroup rgroup=(RadioGroup) view.findViewById(R.id.rgroup); rgroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { public void onCheckedChanged(RadioGroup group, int checkedId) { updatePreview(); } }); viewKeker = (ImageView) view.findViewById(R.id.ambilwarna_keker); previewSB=new SpannableStringBuilder(); previewSB.append(preview.getText()); previewSB.setSpan(new BackgroundColorSpan(bgcolor),0,previewSB.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); previewSB.setSpan(new ForegroundColorSpan(color),0,previewSB.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); preview.setText(previewSB); letakkanPanah(); letakkanKeker(); viewKotak.setHue(hue); viewHue.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_MOVE || event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP) { float y = event.getY(); // dalam px, bukan dp if (y < 0.f) y = 0.f; if (y > ukuranUiPx) y = ukuranUiPx - 0.001f; hue = 360.f - 360.f / ukuranUiPx * y; if (hue == 360.f) hue = 0.f; warnaBaru = hitungWarna(); // update view viewKotak.setHue(hue); letakkanPanah(); updatePreview(); return true; } return false; } }); viewKotak.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_MOVE || event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP) { float x = event.getX(); // dalam px, bukan dp float y = event.getY(); // dalam px, bukan dp if (x < 0.f) x = 0.f; if (x > ukuranUiPx) x = ukuranUiPx; if (y < 0.f) y = 0.f; if (y > ukuranUiPx) y = ukuranUiPx; sat = (1.f / ukuranUiPx * x); val = 1.f - (1.f / ukuranUiPx * y); warnaBaru = hitungWarna(); // update view letakkanKeker(); updatePreview(); return true; } return false; } }); dialog = new Dialog(context); dialog.requestWindowFeature(dialog.getWindow().FEATURE_NO_TITLE); dialog.setContentView(view); } private AlertDialog Dialog(AmbilWarnaDialog ambilWarnaDialog) { // TODO Auto-generated method stub return null; } private void updatePreview() { if(fgSelector.isChecked()) { previewSB.removeSpan(previewSB.getSpans(0,previewSB.length(),ForegroundColorSpan.class)[0]); previewSB.setSpan(new ForegroundColorSpan(warnaBaru), 0,previewSB.length() ,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); mTextColor=warnaBaru; } else if(bgSelector.isChecked()){ previewSB.removeSpan(previewSB.getSpans(0,previewSB.length(),BackgroundColorSpan.class)[0]); previewSB.setSpan(new BackgroundColorSpan(warnaBaru), 0,previewSB.length() ,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); mBgColor=warnaBaru; } preview.setText(previewSB); } @SuppressWarnings("deprecation") protected void letakkanPanah() { float y = ukuranUiPx - (hue * ukuranUiPx / 360.f); if (y == ukuranUiPx) y = 0.f; AbsoluteLayout.LayoutParams layoutParams = (AbsoluteLayout.LayoutParams) panah.getLayoutParams(); layoutParams.y = (int) (y + 4); panah.setLayoutParams(layoutParams); } @SuppressWarnings("deprecation") protected void letakkanKeker() { float x = sat * ukuranUiPx; float y = (1.f - val) * ukuranUiPx; AbsoluteLayout.LayoutParams layoutParams = (AbsoluteLayout.LayoutParams) viewKeker.getLayoutParams(); layoutParams.x = (int) (x + 3); layoutParams.y = (int) (y + 3); viewKeker.setLayoutParams(layoutParams); } float[] tmp01 = new float[3]; private int hitungWarna() { tmp01[0] = hue; tmp01[1] = sat; tmp01[2] = val; return Color.HSVToColor(tmp01); } public void show() { dialog.show(); } }