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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo