我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中颜色选择器和改变字体颜色的实例教程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中颜色选择器和改变字体颜色的实例教程

1.构建一张七彩图:

我们经常看到这种样子的颜色选择器吧..

2016428153031140.png (252×184)

2016428153107368.png (673×300)

然后其实右边的亮度选择是:

2016428153128201.png (168×184)

这样我们的代码就可以进行啦...
 


// 创建七彩图片
 private void init() {
 int[] oc = { 0xffff0000, 0xffffff00, 0xff00ff00, 0xff00ffff,
  0xff0000ff, 0xffff00ff, 0xffff0000 };
 float[] op = { 0, 0.16667f, 0.33333f, 0.5f, 0.66667f, 0.83333f, 1 };
 LinearGradient lg = new LinearGradient(0, 0, ORIWIDTH, 0, oc, op,
  TileMode.MIRROR);
 LinearGradient lg2 = new LinearGradient(0, 0, 0, ORIHEIGHT, 0x00808080,
  0xff808080, TileMode.MIRROR);
 oriColor = Bitmap.createBitmap(ORIWIDTH, ORIHEIGHT, Config.ARGB_8888);
 Canvas c = new Canvas(oriColor);
 paint.setShader(lg);
 c.drawRect(0, 0, ORIWIDTH, ORIHEIGHT, paint);
 paint.setShader(lg2);
 c.drawRect(0, 0, ORIWIDTH, ORIHEIGHT, paint);
 }
// 右边的亮度栏
 private void drawABar(Canvas c) {
 int x, y;
 x = (roundColor & 0x00ffffff);
 y = (x | 0xff000000);
 LinearGradient lg = new LinearGradient(0, 0, layoutWidth, 0, x, y,
  TileMode.MIRROR);
 // 初始化 x 240 + 6 * 2
 y = ORIHEIGHT + (GAP << 2) - GAP + BARHEIGHT; 
 paint.setColor(0xffffffff); 
 c.drawBitmap(aBk, 0, y, paint);
 paint.setShader(lg);
 c.drawRect(0, y, layoutWidth, y + BARHEIGHT, paint);
 }

其他屏幕事件什么的就不贴代码啦...

2016428153425542.jpg (267×375)

2.ColorPicker颜色选择器改变字体颜色实例:

(1)测试界面

2016428153446166.jpg (481×801)

(2)调色板对话框

2016428153502672.jpg (481×801)

(3)改变字体颜色 

2016428153526279.jpg (481×801)

嗯好,来看代码:


package com.xsl.colorpicker; 
import android.app.Dialog; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.LinearGradient; 
import android.graphics.Paint; 
import android.graphics.RectF; 
import android.graphics.Shader; 
import android.graphics.SweepGradient; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.WindowManager; 
public class ColorPickerDialog extends Dialog { 
  private final boolean debug = true; 
  private final String TAG = "ColorPicker"; 
  Context context; 
  private String title;    //标题 
  private int mInitialColor; //初始颜色 
  private OnColorChangedListener mListener; 
   
  public ColorPickerDialog(Context context, String title,  
      OnColorChangedListener listener) { 
    this(context, Color.BLACK, title, listener); 
  } 

   
  public ColorPickerDialog(Context context, int initialColor,  
      String title, OnColorChangedListener listener) { 
    super(context); 
    this.context = context; 
    mListener = listener; 
    mInitialColor = initialColor; 
    this.title = title; 
  } 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    WindowManager manager = getWindow().getWindowManager(); 
    int height = (int) (manager.getDefaultDisplay().getHeight() * 0.38f);    //0.5 
    int width = (int) (manager.getDefaultDisplay().getWidth() * 0.5f);     //0.7 
    ColorPickerView myView = new ColorPickerView(context, height, width); 
    setContentView(myView); 
    setTitle(title); 
  } 

  private class ColorPickerView extends View { 
    private Paint mPaint;      //渐变色环画笔 
    private Paint mCenterPaint;   //中间圆画笔 
    private Paint mLinePaint;    //分隔线画笔 
    private Paint mRectPaint;    //渐变方块画笔 
    private Shader rectShader;   //渐变方块渐变图像 
    private float rectLeft;     //渐变方块左x坐标 
    private float rectTop;     //渐变方块右x坐标 
    private float rectRight;    //渐变方块上y坐标 
    private float rectBottom;    //渐变方块下y坐标 
    private final int[] mCircleColors;   //渐变色环颜色 
    private final int[] mRectColors;    //渐变方块颜色 
    private int mHeight;          //View高 
    private int mWidth;           //View宽 
    private float r;            //色环半径(paint中部) 
    private float centerRadius;       //中心圆半径 
    private boolean downInCircle = true;  //按在渐变环上 
    private boolean downInRect;       //按在渐变方块上 
    private boolean highlightCenter;    //高亮 
    private boolean highlightCenterLittle; //微亮 
    public ColorPickerView(Context context, int height, int width) { 
      super(context); 
      this.mHeight = height - 36; 
      this.mWidth = width; 
      setMinimumHeight(height - 36); 
      setMinimumWidth(width); 
      //渐变色环参数 
      mCircleColors = new int[] {0xFFFF0000, 0xFFFF00FF, 0xFF0000FF,  
          0xFF00FFFF, 0xFF00FF00,0xFFFFFF00, 0xFFFF0000}; 
      Shader s = new SweepGradient(0, 0, mCircleColors, null); 
      mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
      mPaint.setShader(s); 
      mPaint.setStyle(Paint.Style.STROKE); 
      mPaint.setStrokeWidth(50); 
      r = width / 2 * 0.7f - mPaint.getStrokeWidth() * 0.5f; 
      //中心圆参数 
      mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
      mCenterPaint.setColor(mInitialColor); 
      mCenterPaint.setStrokeWidth(5); 
      centerRadius = (r - mPaint.getStrokeWidth() / 2 ) * 0.7f; 
      //边框参数 
      mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
      mLinePaint.setColor(Color.parseColor("#72A1D1")); 
      mLinePaint.setStrokeWidth(4); 
      //黑白渐变参数 
      mRectColors = new int[]{0xFF000000, mCenterPaint.getColor(), 0xFFFFFFFF}; 
      mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
      mRectPaint.setStrokeWidth(5); 
      rectLeft = -r - mPaint.getStrokeWidth() * 0.5f; 
      rectTop = r + mPaint.getStrokeWidth() * 0.5f +  
          mLinePaint.getStrokeMiter() * 0.5f + 15; 
      rectRight = r + mPaint.getStrokeWidth() * 0.5f; 
      rectBottom = rectTop + 50; 
    } 

  
   


    @Override 
    protected void onDraw(Canvas canvas) { 
      //移动中心 
      canvas.translate(mWidth / 2, mHeight / 2 - 50); 
      //画中心圆 
      canvas.drawCircle(0, 0, centerRadius, mCenterPaint); 
      //是否显示中心圆外的小圆环 
      if (highlightCenter || highlightCenterLittle) { 
        int c = mCenterPaint.getColor(); 
        mCenterPaint.setStyle(Paint.Style.STROKE); 
        if(highlightCenter) { 
          mCenterPaint.setAlpha(0xFF); 
        }else if(highlightCenterLittle) { 
          mCenterPaint.setAlpha(0x90); 
        } 
        canvas.drawCircle(0, 0,  
            centerRadius + mCenterPaint.getStrokeWidth(), mCenterPaint); 
        mCenterPaint.setStyle(Paint.Style.FILL); 
        mCenterPaint.setColor(c); 
      } 

  


      //画色环 
      canvas.drawOval(new RectF(-r, -r, r, r), mPaint); 
      //画黑白渐变块 
      if(downInCircle) { 
        mRectColors[1] = mCenterPaint.getColor(); 
      } 
      rectShader = new LinearGradient(rectLeft, 0, rectRight, 0, mRectColors, null, Shader.TileMode.MIRROR); 
      mRectPaint.setShader(rectShader); 
      canvas.drawRect(rectLeft, rectTop, rectRight, rectBottom, mRectPaint); 
      float offset = mLinePaint.getStrokeWidth() / 2; 
      canvas.drawLine(rectLeft - offset, rectTop - offset * 2,  
          rectLeft - offset, rectBottom + offset * 2, mLinePaint);//左 
      canvas.drawLine(rectLeft - offset * 2, rectTop - offset,  
          rectRight + offset * 2, rectTop - offset, mLinePaint);//上 
      canvas.drawLine(rectRight + offset, rectTop - offset * 2,  
          rectRight + offset, rectBottom + offset * 2, mLinePaint);//右 
      canvas.drawLine(rectLeft - offset * 2, rectBottom + offset,  
          rectRight + offset * 2, rectBottom + offset, mLinePaint);//下 
      super.onDraw(canvas); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
      float x = event.getX() - mWidth / 2; 
      float y = event.getY() - mHeight / 2 + 50; 
      boolean inCircle = inColorCircle(x, y,  
          r + mPaint.getStrokeWidth() / 2, r - mPaint.getStrokeWidth() / 2); 
      boolean inCenter = inCenter(x, y, centerRadius); 
      boolean inRect = inRect(x, y); 
      switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
          downInCircle = inCircle; 
          downInRect = inRect; 
          highlightCenter = inCenter; 
        case MotionEvent.ACTION_MOVE: 
          if(downInCircle && inCircle) {//down按在渐变色环内, 且move也在渐变色环内 
            float angle = (float) Math.atan2(y, x); 
            float unit = (float) (angle / (2 * Math.PI)); 
            if (unit < 0) { 
              unit += 1; 
            } 
            mCenterPaint.setColor(interpCircleColor(mCircleColors, unit)); 
            if(debug) Log.v(TAG, "色环内, 坐标: " + x + "," + y); 
          }else if(downInRect && inRect) {//down在渐变方块内, 且move也在渐变方块内 
            mCenterPaint.setColor(interpRectColor(mRectColors, x)); 
          } 
          if(debug) Log.v(TAG, "[MOVE] 高亮: " + highlightCenter + "微亮: " + highlightCenterLittle + " 中心: " + inCenter); 
          if((highlightCenter && inCenter) || (highlightCenterLittle && inCenter)) {//点击中心圆, 当前移动在中心圆 
            highlightCenter = true; 
            highlightCenterLittle = false; 
          } else if(highlightCenter || highlightCenterLittle) {//点击在中心圆, 当前移出中心圆 
            highlightCenter = false; 
            highlightCenterLittle = true; 
          } else { 
            highlightCenter = false; 
            highlightCenterLittle = false; 
          } 
          invalidate(); 
          break; 
        case MotionEvent.ACTION_UP: 
          if(highlightCenter && inCenter) {//点击在中心圆, 且当前启动在中心圆 
            if(mListener != null) { 
              mListener.colorChanged(mCenterPaint.getColor()); 
              ColorPickerDialog.this.dismiss(); 
            } 
          } 
          if(downInCircle) { 
            downInCircle = false; 
          } 
          if(downInRect) { 
            downInRect = false; 
          } 
          if(highlightCenter) { 
            highlightCenter = false; 
          } 
          if(highlightCenterLittle) { 
            highlightCenterLittle = false; 
          } 
          invalidate(); 
          break; 
      } 
      return true; 
    } 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
      super.onMeasure(mWidth, mHeight); 
    } 

     
    private boolean inColorCircle(float x, float y, float outRadius, float inRadius) { 
      double outCircle = Math.PI * outRadius * outRadius; 
      double inCircle = Math.PI * inRadius * inRadius; 
      double fingerCircle = Math.PI * (x * x + y * y); 
      if(fingerCircle < outCircle && fingerCircle > inCircle) { 
        return true; 
      }else { 
        return false; 
      } 
    } 

     
    private boolean inCenter(float x, float y, float centerRadius) { 
      double centerCircle = Math.PI * centerRadius * centerRadius; 
      double fingerCircle = Math.PI * (x * x + y * y); 
      if(fingerCircle < centerCircle) { 
        return true; 
      }else { 
        return false; 
      } 
    } 

     
    private boolean inRect(float x, float y) { 
      if( x <= rectRight && x >=rectLeft && y <= rectBottom && y >=rectTop) { 
        return true; 
      } else { 
        return false; 
      } 
    } 

     
    private int interpCircleColor(int colors[], float unit) { 
      if (unit <= 0) { 
        return colors[0]; 
      } 
      if (unit >= 1) { 
        return colors[colors.length - 1]; 
      } 
      float p = unit * (colors.length - 1); 
      int i = (int)p; 
      p -= i; 
      // now p is just the fractional part [0...1) and i is the index 
      int c0 = colors[i]; 
      int c1 = colors[i+1]; 
      int a = ave(Color.alpha(c0), Color.alpha(c1), p); 
      int r = ave(Color.red(c0), Color.red(c1), p); 
      int g = ave(Color.green(c0), Color.green(c1), p); 
      int b = ave(Color.blue(c0), Color.blue(c1), p); 
      return Color.argb(a, r, g, b); 
    } 

     
    private int interpRectColor(int colors[], float x) { 
      int a, r, g, b, c0, c1; 
      float p; 
      if (x < 0) { 
        c0 = colors[0];  
        c1 = colors[1]; 
        p = (x + rectRight) / rectRight; 
      } else { 
        c0 = colors[1]; 
        c1 = colors[2]; 
        p = x / rectRight; 
      } 
      a = ave(Color.alpha(c0), Color.alpha(c1), p); 
      r = ave(Color.red(c0), Color.red(c1), p); 
      g = ave(Color.green(c0), Color.green(c1), p); 
      b = ave(Color.blue(c0), Color.blue(c1), p); 
      return Color.argb(a, r, g, b); 
    } 
    private int ave(int s, int d, float p) { 
      return s + Math.round(p * (d - s)); 
    } 
  } 

   
  public interface OnColorChangedListener { 
     
    void colorChanged(int color); 
  } 
  public String getTitle() { 
    return title; 
  } 
  public void setTitle(String title) { 
    this.title = title; 
  } 
  public int getmInitialColor() { 
    return mInitialColor; 
  } 
  public void setmInitialColor(int mInitialColor) { 
    this.mInitialColor = mInitialColor; 
  } 
  public OnColorChangedListener getmListener() { 
    return mListener; 
  } 
  public void setmListener(OnColorChangedListener mListener) { 
    this.mListener = mListener; 
  } 
} 

 
测试界面
PaintDemoActivity.java


package com.xsl.colorpicker; 
import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
public class PaintDemoActivity extends Activity {   
  Context context;   
  private Button btnColorPicker;   
  private TextView tvText;   
  private ColorPickerDialog dialog;   
  @Override  
  public void onCreate(Bundle savedInstanceState) { 
    context = this; 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    initViews(); 
  } 
    
  private void initViews() {   
    btnColorPicker = (Button) findViewById(R.id.button1);   
    btnColorPicker.setOnClickListener(new View.OnClickListener() {   
      public void onClick(View v) {   
        dialog = new ColorPickerDialog(context, tvText.getTextColors().getDefaultColor(),   
            getResources().getString(R.string.app_name),   
            new ColorPickerDialog.OnColorChangedListener() {   
          public void colorChanged(int color) {   
            tvText.setTextColor(color);   
          }   
        });   
        dialog.show(); 
      }   
    });   
    tvText = (TextView) findViewById(R.id.tv);   
  }   
} 
您可能感兴趣的文章:Android selector背景选择器的使用详解Android时间选择器、日期选择器实现代码浅谈谈Android 图片选择器Android自定义可循环的滚动选择器CycleWheelViewandroid 字体颜色选择器(ColorPicker)介绍Android仿微信照片选择器实现预览查看图片Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)基于android背景选择器selector的用法汇总Android PickerView滚动选择器的使用方法android自定义滚轴选择器


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中颜色选择器和改变字体颜色的实例教程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中颜色选择器和改变字体颜色的实例教程

1.构建一张七彩图:我们经常看到这种样子的颜色选择器吧..然后其实右边的亮度选择是:这样我们的代码就可以进行啦... // 创建七彩图片private void init() {int[] oc = { 0xffff0000, 0xfff
2022-06-06

Android使用selector修改TextView中字体颜色和背景色的方法

本文实例讲述了Android使用selector修改TextView中字体颜色和背景色的方法。分享给大家供大家参考,具体如下: android中的selector大家都很熟悉了,用它可以很方便的实现,控件在不同的动作中,颜色等值的变化。这里
2022-06-06

Android 微信6.1 tab栏图标和字体颜色渐变的实现

相信大家都见到了微信图标颜色渐变的过程,是不是感觉很牛逼?不得不说微信团队确实是很厉害的团队,不管是从设计还是开发人员。 今天我带大家来看看,微信 tab 栏图标和字体颜色渐变的过程。先上图吧!今天学了一招制作 gif 动态图的快捷方法。刚
2022-06-06

Android 改变图标原有颜色和搜索框的实例代码

图标改变颜色:Drawable的变色,让Android也能有iOS那么方便的图片色调转换,就像同一个图标,但是有多个地方使用,并且颜色不一样,就可以用这个方法了。搜索框: 一般是EditText实现,本文 实现 TextView图片和文字居
2023-05-30

如何实现在shell或者perl中改变字体或背景的颜色

本篇内容介绍了“如何实现在shell或者perl中改变字体或背景的颜色”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在shell下提到终端的
2023-06-09

Android实现修改状态栏背景、字体和图标颜色的方法

前言:Android开发,对于状态栏的修改,实在是不友好,没什么api可以用,不像ios那么方便.但是ui又喜欢只搞ios一套.没办法.各种翻源码,写反射.真的蛋疼.需求场景:当toolbar及状态栏需要为白色或浅色时(如简书),状态栏由于
2023-05-30

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录