Android 仿PhotoShop调色板应用(四) 不同区域颜色选择的颜色生成响应
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android 仿PhotoShop调色板应用(四) 不同区域颜色选择的颜色生成响应
上一篇讲过了主体界面的绘制,这里讲解调色板应用中的另外一个核心: 颜色选择及生成.
ColorPcikerView中不同部分的选择和ColorPickerPanelView中颜色显示是怎样响应的呢?这里当然少不了回调函数:
ColorPickerView:
- public interface OnColorChangedListener {
- public void onColorChanged(int color);
- }
然后看一下轨迹球的事件处理:
- @Override
- public 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中关于触摸事件的处理:
- @Override
- public 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接口:
并完成对应方法:
- @Override
- public void onColorChanged(int color) {
- mNewColor.setColor(color);// mNewColor即为右下角实时显示颜色的ColorPickerPanelView
- if (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点击后的颜色设置事件处理:
- @Override
- public 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;
- ublic interface OnColorChangedListener {
- public void onColorChanged(int color);
最终的颜色是怎么显示到ColorPickerPreference上呢,其实实现的方法是一样的:
- implements ColorPickerDialog.OnColorChangedListener
在ColorPickerPreference中实现对应的回调方法:
- @Override
- public 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 image
- int 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调色板应用(三) 主体界面绘制 关于PhotoShop调色板应用的实现我总结了两个最核心的部分: 1 ...
- Android 仿PhotoShop调色板应用(二) 透明度绘制之AlphaPatternDrawable
版权声明:本文为博主原创文章,未经博主允许不得转载. Android 仿PhotoShop调色板应用(二) 透明度绘制之AlphaPatternDrawable 这里讲一下如何实现PS调色板中的透明度 ...
- Android 仿PhotoShop调色板应用(一)概述
版权声明:本文为博主原创文章,未经博主允许不得转载. 在前面的系列我已经将Android中颜色渲染的原理及使用做了一个整体上概述. 现在开始根据一个比较复杂的实现进行具体的分析,这就是PhotoSho ...
- Android仿人人客户端(v5.7.1)——个人主页(三)
转载请标明出处:http://blog.csdn.net/android_ls/article/details/9405089 声明:仿人人项目,所用所有图片资源都来源于其它Android移动应用,编 ...
- Android仿人人客户端(v5.7.1)——新鲜事之完整篇
转载请标明出处: http://blog.csdn.net/android_ls/article/details/9228083 声明:仿人人项目,所用所有图片资源都来源于其它Androi ...
- Android OpenGL ES(十四)gl10方法解析
Android 支持 OpenGL 列表 1.GL 2.GL 10 3.GL 10 EXT 4.GL 11 5.GL 11 EXT 6.GL 11 ExtensionPack 我们将使用 GL10 这 ...
- Android 仿知乎创意广告
代码地址如下:http://www.demodashi.com/demo/14904.html 一.概述 貌似前段时间刷知乎看到的一种非常有特色的广告展现方式,即在列表页,某一个Item显示背后部分广 ...
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...
- android仿漫画源码、抽奖转盘、Google相册、动画源码等
Android精选源码 android实现仿今日头条的开源项目 波浪效果,实现流量的动态显示 美妆领域的app, 集成了摄像头取色, 朋友圈, 滤镜等 android仿漫画源码 android一个视差 ...
随机推荐
- 安装python-MySQLdb 出现error: command 'gcc' failed with exit status 1的解决方法
>>> yum install MySQL-p* >>>yum install python-devel >>>cd MySQL-python-1 ...
- 【C语言】重定向和文件
重定向和文件 一.相关基础知识 重定向:在计算机领域,重定向是大多数命令行解释器所具有的功能,包括各种可以将标准流重定向用户规定地点的Unix shells. 输入重定向:可以使程序能够使用文件代替键 ...
- 自动发布工具版本从python2升级成python3后遇到的种种问题(涉及paramiko,Crypto,zipfile等等)
从在公司实习到正式入职,一直还在被同事使用的是我写的一个自动发布工具.该工具的主要功能是:开发人员给出需要更新的代码包(zip格式),测试人员将该代码包部署到测服,这些代码包和JIRA数据库里的项目信 ...
- Mvc Model 模板的获取【学习笔记】
MVC的Model模板有两种:一种编辑模式(@Html.EditorFor()).一种显示模式(Html.DisplayFor()). 模板的获取与执行(以下转自这里): 当我们调用HtmlHelpe ...
- 利用R进行多元线性回归分析
对于一个因变量y,n个自变量x1,...,xn,要如何判断y与这n个自变量之间是否存在线性关系呢? 肯定是要利用他们的数据集,假设数据集中有m个样本,那么,每个样本都分别对应着一个因变量和一个n维的自 ...
- webserver<1>
1. 实现基础的信号处理 sigaction使用前一定内存清零 2. 实现基础的进程模型 wait 等待子进程结束 #include <stdio.h> #include <unis ...
- 我的前端之旅--SeaJs基础和spm编译工具运用[图文]
标签:seajs nodejs npm spm js 1. 概述 本文章来源于本人在项目的实际应用中写下的记录.因初期在安装和使用Seajs和SPM的时候,有点不知所措的经历.为此,我 ...
- 使用spm build 批量打包压缩seajs 代码
一,安装环境 1.安装spm spm工具是基于node(nodejs的服务平台)的,因此我们需要先安装 node 和 npm 下载地址:http://nodejs.org/#download.下载完成 ...
- Git入门简介
1. Git 背景 Git 最初由Linus Torvalds编写,用于 Linux 内核开发的版本控制工具. Git 与常用的版本控制工具 CVS.Subversion 等不同,它采用了分布式版本 ...
- Linux Shell编程(25)——I/O 重定向
默认情况下始终有3个"文件"处于打开状态, stdin (键盘), stdout (屏幕), and stderr (错误消息输出到屏幕上). 这3个文件和其他打开的文件都可以被重 ...