Android 仿PhotoShop调色板应用(四) 不同区域颜色选择的颜色生成响应

本文主要是介绍Android 仿PhotoShop调色板应用(四) 不同区域颜色选择的颜色生成响应,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 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调色板应用(四) 不同区域颜色选择的颜色生成响应的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792779

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

java中不同版本JSONObject区别小结

《java中不同版本JSONObject区别小结》本文主要介绍了java中不同版本JSONObject区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1. FastjsON2. Jackson3. Gson4. org.json6. 总结在Jav

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo