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

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或