Android 仿PhotoShop调色板应用(四) 不同区域颜色选择的颜色生成响应
来源:互联网 发布:删失数据的定义 编辑:程序博客网 时间:2024/05/03 11:57
Android 仿PhotoShop调色板应用(四) 不同区域颜色选择的颜色生成响应
上一篇讲过了主体界面的绘制,这里讲解调色板应用中的另外一个核心: 颜色选择及生成.
ColorPcikerView中不同部分的选择和ColorPickerPanelView中颜色显示是怎样响应的呢?这里当然少不了回调函数:
ColorPickerView:
public interface OnColorChangedListener {public void onColorChanged(int color);}
然后看一下轨迹球的事件处理:
@Overridepublic boolean onTrackballEvent(MotionEvent event) {float x = event.getX();float y = event.getY();boolean update = false;//是否需要更新颜色if(event.getAction() == MotionEvent.ACTION_MOVE){switch(mLastTouchedPanel){case PANEL_SAT_VAL://饱和度&亮度选择区域float sat, val;sat = mSat + x/50f;val = mVal - y/50f;if(sat < 0f){sat = 0f;}else if(sat > 1f){sat = 1f;}if(val < 0f){val = 0f;}else if(val > 1f){val = 1f;}mSat = sat;mVal = val;update = true;break;case PANEL_HUE://色相选择区域float hue = mHue - y * 10f;if(hue < 0f){hue = 0f;}else if(hue > 360f){hue = 360f;}mHue = hue;update = true;break;case PANEL_ALPHA://透明度选择区域if(!mShowAlphaPanel || mAlphaRect == null){update = false;}else{int alpha = (int) (mAlpha - x*10);if(alpha < 0){alpha = 0;}else if(alpha > 0xff){alpha = 0xff;}mAlpha = alpha;update = true;}break;}}if(update){//如果需要更新,调用对用的回调函数并重新绘制if(mListener != null){//参数需要由HSV格式的float数组转换为ARGB格式的 int 参数mListener.onColorChanged(Color.HSVToColor(mAlpha, new float[]{mHue, mSat, mVal}));} invalidate(); return true;}return super.onTrackballEvent(event);}
ColorPickerView中关于触摸事件的处理:
@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean update = false;switch(event.getAction()){case MotionEvent.ACTION_DOWN:mStartTouchPoint = new Point((int)event.getX(), (int)event.getY());update = moveTrackersIfNeeded(event);break;case MotionEvent.ACTION_MOVE:update = moveTrackersIfNeeded(event);break;case MotionEvent.ACTION_UP:mStartTouchPoint = null;update = moveTrackersIfNeeded(event);break;}if(update){if(mListener != null){mListener.onColorChanged(Color.HSVToColor(mAlpha, new float[]{mHue, mSat, mVal}));}invalidate();return true;}return super.onTouchEvent(event);} //判断是否触发事件,更新区域颜色 private boolean moveTrackersIfNeeded(MotionEvent event){ if(mStartTouchPoint == null) return false; boolean update = false; //获取触摸点X,Y坐标值 int startX = mStartTouchPoint.x; int startY = mStartTouchPoint.y; //判断 X,Y坐标是否在对应的区域内,并做相应的处理 if(mHueRect.contains(startX, startY)){ mLastTouchedPanel = PANEL_HUE; mHue = pointToHue(event.getY()); update = true; } else if(mSatValRect.contains(startX, startY)){ mLastTouchedPanel = PANEL_SAT_VAL; float[] result = pointToSatVal(event.getX(), event.getY()); mSat = result[0]; mVal = result[1]; update = true; } else if(mAlphaRect != null && mAlphaRect.contains(startX, startY)){ mLastTouchedPanel = PANEL_ALPHA; mAlpha = pointToAlpha((int)event.getX()); update = true; } return update; }
使用时,让ColorPickerDialog实现ColorPickerView.OnColorChangedListener接口:
并完成对应方法:
@Overridepublic void onColorChanged(int color) {mNewColor.setColor(color);// mNewColor即为右下角实时显示颜色的ColorPickerPanelViewif (mHexValueEnabled)updateHexValue(color);/*if (mListener != null) {mListener.onColorChanged(color);}*/}
private void updateHexValue(int color) {if (getAlphaSliderVisible()) {mHexVal.setText(ColorPickerPreference.convertToARGB(color).toUpperCase(Locale.getDefault()));} else {mHexVal.setText(ColorPickerPreference.convertToRGB(color).toUpperCase(Locale.getDefault()));}mHexVal.setTextColor(mHexDefaultTextColor);}
/** 转化为ARGB格式字符串 * For custom purposes. Not used by ColorPickerPreferrence * @param color * @author Unknown */ public static String convertToARGB(int color) { String alpha = Integer.toHexString(Color.alpha(color)); String red = Integer.toHexString(Color.red(color)); String green = Integer.toHexString(Color.green(color)); String blue = Integer.toHexString(Color.blue(color)); if (alpha.length() == 1) { alpha = "0" + alpha; } if (red.length() == 1) { red = "0" + red; } if (green.length() == 1) { green = "0" + green; } if (blue.length() == 1) { blue = "0" + blue; } return "#" + alpha + red + green + blue; }
最后看一下ColorPickerPanelView点击后的颜色设置事件处理:
@Overridepublic void onClick(View v) {if (v.getId() == R.id.new_color_panel) {if (mListener != null) {mListener.onColorChanged(mNewColor.getColor());}}dismiss();}
注意一下,这里的OnColorChangedListener是在ColorPickerDialog中定义的:
private OnColorChangedListener mListener;public interface OnColorChangedListener {public void onColorChanged(int color);}
最终的颜色是怎么显示到ColorPickerPreference上呢,其实实现的方法是一样的:
implements ColorPickerDialog.OnColorChangedListener
在ColorPickerPreference中实现对应的回调方法:
@Overridepublic void onColorChanged(int color) {if (isPersistent()) {persistInt(color);}mValue = color;setPreviewColor();try {getOnPreferenceChangeListener().onPreferenceChange(this, color);} catch (NullPointerException e) {}}
调用setPreviewColor()改变ColorPickerPreference中颜色区域的显示:
private void setPreviewColor() {if (mView == null) return;ImageView iView = new ImageView(getContext());LinearLayout widgetFrameView = ((LinearLayout)mView.findViewById(android.R.id.widget_frame));if (widgetFrameView == null) return;widgetFrameView.setVisibility(View.VISIBLE);widgetFrameView.setPadding(widgetFrameView.getPaddingLeft(),widgetFrameView.getPaddingTop(),(int)(mDensity * 8),widgetFrameView.getPaddingBottom());// remove already create preview imageint count = widgetFrameView.getChildCount();if (count > 0) {widgetFrameView.removeViews(0, count);}widgetFrameView.addView(iView);widgetFrameView.setMinimumWidth(0);iView.setBackgroundDrawable(new AlphaPatternDrawable((int)(5 * mDensity)));iView.setImageBitmap(getPreviewBitmap());}
最后调用getOnPreferenceChangeListener().onPreferenceChange(this, color);改变颜色设置值
然后在下次打开ColorPickerDialog时,传入上面onColorChanged()回调实现中已经改变的mValue参数
mDialog = new ColorPickerDialog(getContext(), mValue);
至此,PS调色板应用中颜色交互的事件讲解完毕.
相信当分析完PhotoShop调色板应用后,大家会对颜色渲染方面会有一个认识上的提高.
- Android 仿PhotoShop调色板应用(四) 不同区域颜色选择的颜色生成响应
- Android 仿PhotoShop调色板应用(四) 不同区域颜色选择的颜色生成响应
- Android 仿PhotoShop调色板应用(一)概述
- Android 仿PhotoShop调色板应用(一)概述
- Android 仿PhotoShop调色板应用(一)概述
- Android 颜色资源UI的调色板颜色
- Android 仿PhotoShop调色板应用(二) 透明度绘制之AlphaPatternDrawable
- Android 仿PhotoShop调色板应用(三) 主体界面绘制
- Android 仿PhotoShop调色板应用(二) 透明度绘制之AlphaPatternDrawable
- Android 仿PhotoShop调色板应用(三) 主体界面绘制
- Android 仿PhotoShop调色板应用(二) 透明度绘制之AlphaPatternDrawable
- VC利用调色板选择颜色
- Android调色板的开发与RGB颜色的使用
- Android简单手电筒的应用可以设置不同的颜色
- [教程]仿photoshop拾色器调整颜色
- TextView 设置不同的颜色,点击响应不同的操作。
- android 颜色选择的实现
- Android:Paletee颜色提取用法(调色板)
- 基于Hadoop的Clearinghouse系统架构设计
- 数组链表
- Android 仿PhotoShop调色板应用(二) 透明度绘制之AlphaPatternDrawable
- Android 仿PhotoShop调色板应用(三) 主体界面绘制
- UVA 10341 Solve It 解方程 二分查找+精度
- Android 仿PhotoShop调色板应用(四) 不同区域颜色选择的颜色生成响应
- 网络编程技术(技术总结)
- Linux中权限(r、w、x)对于目录与文件的意义
- Nginx-ngx_hash
- 随想而已
- 一个简单gtk程序
- uva10344
- xfire接收自定义对象
- Android程序对不同手机屏幕分辨率自适应的方法