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

1.构建一张七彩图:

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

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

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

// 创建七彩图片
 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);
 }

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

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

(1)测试界面

(2)调色板对话框

(3)改变字体颜色 

嗯好,来看代码:

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; 

  /** 

   * 初始颜色黑色 

   * @param context 

   * @param title 对话框标题 

   * @param listener 回调 

   */ 

  public ColorPickerDialog(Context context, String title,  

      OnColorChangedListener listener) { 

    this(context, Color.BLACK, title, listener); 

  } 
  /** 

   * 

   * @param context 

   * @param initialColor 初始颜色 

   * @param title 标题 

   * @param 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); 

    } 
    /** 

     * 坐标是否在色环上 

     * @param x 坐标 

     * @param y 坐标 

     * @param outRadius 色环外半径 

     * @param inRadius 色环内半径 

     * @return 

     */ 

    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; 

      } 

    } 
    /** 

     * 坐标是否在中心圆上 

     * @param x 坐标 

     * @param y 坐标 

     * @param centerRadius 圆半径 

     * @return 

     */ 

    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; 

      } 

    }
    /** 

     * 坐标是否在渐变色中 

     * @param x 

     * @param y 

     * @return 

     */ 

    private boolean inRect(float x, float y) { 

      if( x <= rectRight && x >=rectLeft && y <= rectBottom && y >=rectTop) { 

        return true; 

      } else { 

        return false; 

      } 

    } 
    /** 

     * 获取圆环上颜色 

     * @param colors 

     * @param unit 

     * @return 

     */ 

    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); 

    } 
    /** 

     * 获取渐变块上颜色 

     * @param colors 

     * @param x 

     * @return 

     */ 

    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 { 

    /** 

     * 回调函数 

     * @param color 选中的颜色 

     */ 

    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(); 

  } 

  /**  

   * 初始化UI  

   */  

  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
, 字体
, 安卓
, 背景
, 颜色选择器
ColorPicker
android颜色选择器、android 颜色块选择器、android中颜色选择器、android改变图片颜色、android 改变字体颜色,以便于您获取更多的相关知识。

时间: 2024-10-03 21:06:47

Android中颜色选择器和改变字体颜色的实例教程_Android的相关文章

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

1.构建一张七彩图: 我们经常看到这种样子的颜色选择器吧.. 然后其实右边的亮度选择是: 这样我们的代码就可以进行啦... // 创建七彩图片 private void init() { int[] oc = { 0xffff0000, 0xffffff00, 0xff00ff00, 0xff00ffff, 0xff0000ff, 0xffff00ff, 0xffff0000 }; float[] op = { 0, 0.16667f, 0.33333f, 0.5f, 0.66667f, 0.8

Android中ListView下拉刷新的实现方法实例分析_Android

本文实例讲述了Android中ListView下拉刷新的实现方法.分享给大家供大家参考,具体如下: ListView中的下拉刷新是非常常见的,也是经常使用的,看到有很多同学想要,那我就整理一下,供大家参考.那我就不解释,直接上代码了. 这里需要自己重写一下ListView,重写代码如下: package net.loonggg.listview; import java.util.Date; import android.content.Context; import android.util.

Android图片处理:识别图像方向并显示实例教程_Android

在Android中使用ImageView显示图片的时候发现图片显示不正,方向偏了或者倒过来了. 解决这个问题很自然想到的分两步走: 1.自动识别图像方向,计算旋转角度: 2.对图像进行旋转并显示. 一.识别图像方向 首先在这里提一个概念EXIF(Exchangeable Image File Format,可交换图像文件),具体解释参见Wiki. 简而言之,Exif是一个标准,用于电子照相机(也包括手机.扫描器等)上,用来规范图片.声音.视屏以及它们的一些辅助标记格式. Exif支持的格式如下:

Android开发中使用Volley库发送HTTP请求的实例教程_Android

Android Volley 是Google开发的一个网络lib,可以让你更加简单并且快速的访问网络数据.Volley库的网络请求都是异步的,你不必担心异步处理问题. Volley的优点: 请求队列和请求优先级 请求Cache和内存管理 扩展性性强 可以取消请求 下载和编译volley.jar需要安装git,ant,android sdk clone代码: git clone https://android.googlesource.com/platform/frameworks/volley

Android中使用GridView进行应用程序UI布局的教程_Android

0.简介GridView 和 ListView 有共同的父类:AbsListView,因此 GridView 和 ListView 具有一定 的相似性.GridView与ListView的主要区别在于:ListView只是在一个方向上分布:而 GridView则会在两个方向上分布. 与ListView类似的是,GridView也需要通过Adapter来提供显示的数据:开发者既可通 过SimpleAdapter来为GridView提供数据,也可通过开发 BaseAdaptei的子类来为GridVi

Android中实现下载URL地址的网络资源的实例分享_Android

通过URL来获取网络资源并下载资源简单实例: package com.android.xiong.urltest; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import android.app.Activity; import android.gra

关于用ChooseFont(&amp;amp;amp;CHOOSEFONT)对话框改变字体颜色的问题

问题描述 关于用ChooseFont(&CHOOSEFONT)对话框改变字体颜色的问题 部分代码如下:用settextcolor无法改变字体颜色,求教大神,我在学windows程序设计,谢谢 GetObject(GetStockObject(SYSTEM_FONT)sizeof(lf)&lf); cf.lStructSize = sizeof(CHOOSEFONT); cf.hwndOwner = hwnd; cf.hDC = NULL; cf.lpLogFont = &lf; c

TextView法改变字体颜色

问题描述 TextView法改变字体颜色 用TabLayout+ViewPager,实现了导航,pager使用了两个Fragment.在Fragment实现布局的时候添加了多个TextView,在预览状态可以看到字体颜色的修改是成功的,但是当程序运行起来后发现,页面无任何文字.然后给TextView添加背景色,运行发现字体颜色是白色的,之前因为背景也是白色,没显示出来,之后有尝试修改,发现无论怎么修改都**无法改变字体颜色,只能为白色**. 最后发现,在代码中可以设置文字的颜色,但是这样的话很不

请教大神 通用对话框改变字体颜色的问题------谢谢

问题描述 请教大神 通用对话框改变字体颜色的问题------谢谢 cf.lStructSize = sizeof(CHOOSEFONT); cf.hwndOwner = hwnd; cf.hDC = NULL; cf.lpLogFont = &logfont; cf.iPointSize = 0; cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS | CF_EFFECTS; cf.rgbColors =RGB(255,0,0); cf.lCus