Android 사용자 정의 컨트롤 색상 선택 기 구현
activity_mian.xml 파일:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/ll_color"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:gravity="center_horizontal"
android:text=" " />
<LinearLayout
android:id="@+id/ll_color"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical"></LinearLayout>
</RelativeLayout>
MainActivity.java 파일
package zxz.colorpickerdemo;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
import zxz.colorpickerdemo.view.ColorPickerView;
public class MainActivity extends AppCompatActivity {
private LinearLayout ll;
private TextView tv;
private ColorPickerView colorPickerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ll = (LinearLayout) findViewById(R.id.ll_color);
tv = (TextView) findViewById(R.id.tv_info);
colorPickerView = new ColorPickerView(this);
ll.addView(colorPickerView);
colorPickerView.setOnColorBackListener(new ColorPickerView.OnColorBackListener() {
@Override
public void onColorBack(int a, int r, int g, int b) {
tv.setText("R:" + r + "
G:" + g + "
B:" + b + "
" + colorPickerView.getStrColor());
tv.setTextColor(Color.argb(a, r, g, b));
}
});
}
}
사용자 정의 컨트롤 이 레이아웃 파일 에 직접 사용 되 지 않 은 것 을 알 수 있 습 니 다.사용자 가 서로 다른 수요 에 따라 사용자 정의 컨트롤 의 구조 함 수 를 통 해 컨트롤 에 전달 해 야 하기 때문에 ViewGroup.add()를 통 해 ColorPickerView 를 추가 합 니 다!
ColorPickerView colorPickerView = new ColorPickerView(context);
ll.addView(colorPickerView);
-핵심 부분바로 ColorPickerView 의 실현 코드 입 니 다.
package zxz.colorpickerdemo.view;
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.view.MotionEvent;
import android.view.View;
public class ColorPickerView extends View {
private static final float PI = (float) Math.PI;
private Paint paintCirclePhantom;
private Paint paintCircle;
private Paint paintCenterShadow;
private Paint paintCenter;
private Paint paintGrayShadow;
private Paint paintGray;
private Paint paintLightShadow;
private Paint paintLight;
private double Zoom;
private int[] arrColorGray;
private final int[] arrColorCircle = new int[]{0xFFFF0000, 0xFFFF00FF,
0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 0xFFFFFF00, 0xFFFF0000};
private boolean mRedrawHSV;
private boolean IsPressCenter;
private boolean IsMoveCenter;
private int CenterX = 100;
private int CenterY = 100;
private int CenterRadius = 30;
private String strColor = "";
private OnColorBackListener l;
public ColorPickerView(Context context) {
super(context);
float density = getContext().getResources().getDisplayMetrics().density;
double Zoom = (double) (density / 2.0 + 0.5);
int color = Color.parseColor("#FFFFFF");
init(color, Zoom);
}
public ColorPickerView(Context context, int color, double Zoom) {
super(context);
init(color, Zoom);
}
private void init(int color, double Zoom) {
this.Zoom = Zoom;
CenterX = (int) (100 * Zoom);
CenterY = (int) (100 * Zoom);
CenterRadius = (int) (30 * Zoom);
paintCirclePhantom = new Paint(Paint.ANTI_ALIAS_FLAG);
paintCircle = new Paint(Paint.ANTI_ALIAS_FLAG);
paintCenterShadow = new Paint(Paint.ANTI_ALIAS_FLAG);
paintCenter = new Paint(Paint.ANTI_ALIAS_FLAG);
paintGrayShadow = new Paint(Paint.ANTI_ALIAS_FLAG);
paintGray = new Paint(Paint.ANTI_ALIAS_FLAG);
paintLightShadow = new Paint(Paint.ANTI_ALIAS_FLAG);
paintLight = new Paint(Paint.ANTI_ALIAS_FLAG);
paintCirclePhantom.setColor(0xFF000000);
paintCirclePhantom.setStyle(Paint.Style.STROKE);
paintCirclePhantom.setStrokeWidth((float) (32 * Zoom));
paintCircle.setShader(new SweepGradient(0, 0, arrColorCircle, null));
paintCircle.setStyle(Paint.Style.STROKE);
paintCircle.setStrokeWidth((float) (32 * Zoom));
paintCenterShadow.setColor(0xFF000000);
paintCenterShadow.setStrokeWidth((float) (5 * Zoom));
paintCenter.setColor(color);
paintCenter.setStrokeWidth((float) (5 * Zoom));
paintGrayShadow.setColor(0xFF000000);
paintGrayShadow.setStrokeWidth((float) (30 * Zoom));
arrColorGray = new int[]{0xFFFFFFFF, color, 0xFF000000};
paintGray.setStrokeWidth((float) (30 * Zoom));
paintLightShadow.setColor(0xFF000000);
paintLightShadow.setStrokeWidth((float) (60 * Zoom));
paintLight.setStrokeWidth((float) (60 * Zoom));
mRedrawHSV = true;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.translate(CenterX, CenterY);
float r = CenterX - paintCircle.getStrokeWidth() * 0.5f;
int color = paintCenter.getColor();
strColor = "#" + Integer.toHexString(color).substring(2).toUpperCase();
if (mRedrawHSV) {
arrColorGray[1] = color;
paintGray.setShader(new LinearGradient(CenterX, -CenterY, CenterX,
(float) (100 * Zoom), arrColorGray, null,
Shader.TileMode.CLAMP));
}
canvas.drawOval(new RectF(-r + 3, -r + 3, r + 3, r + 3),
paintCirclePhantom);
canvas.drawOval(new RectF(-r, -r, r, r), paintCircle);
canvas.drawCircle(3, 3, CenterRadius, paintCenterShadow);
canvas.drawCircle(0, 0, CenterRadius, paintCenter);
canvas.drawRect(new RectF(CenterX + (float) (18 * Zoom), -CenterY + 3,
CenterX + (float) (48 * Zoom), (float) (103 * Zoom)),
paintGrayShadow);
canvas.drawRect(new RectF(CenterX + (float) (15 * Zoom), -CenterY,
CenterX + (float) (45 * Zoom), (float) (100 * Zoom)), paintGray);
if (IsPressCenter) {
paintCenter.setStyle(Paint.Style.STROKE);
if (IsMoveCenter)
paintCenter.setAlpha(0xFF);
else
paintCenter.setAlpha(0x66);
canvas.drawCircle(0, 0,
CenterRadius + paintCenter.getStrokeWidth(), paintCenter);
paintCenter.setStyle(Paint.Style.FILL);
paintCenter.setColor(color);
}
mRedrawHSV = true;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(CenterX * 2 + 50, CenterY * 2 + 23);
}
private int ave(int s, int d, float p) {
return s + java.lang.Math.round(p * (d - s));
}
private int interpColor(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;
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);
if (l != null) {
l.onColorBack(a, r, g, b);
}
return Color.argb(a, r, g, b);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX() - CenterX;
float y = event.getY() - CenterY;
boolean inCenter = java.lang.Math.sqrt(x * x + y * y) <= CenterRadius;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
IsPressCenter = inCenter;
if (inCenter) {
IsMoveCenter = true;
invalidate();
break;
}
}
case MotionEvent.ACTION_MOVE: {
if (IsPressCenter) {
if (IsMoveCenter != inCenter) {
IsMoveCenter = inCenter;
invalidate();
}
} else if ((x >= -CenterX && x <= CenterX)
&& (y >= -CenterY && y <= CenterY)) {
float angle = (float) java.lang.Math.atan2(y, x);
float unit = angle / (2 * PI);
if (unit < 0)
unit += 1;
paintCenter.setColor(interpColor(arrColorCircle, unit));
invalidate();
} else {
int a, r, g, b, c0, c1;
float p;
if (y < 0) {
c0 = arrColorGray[0];
c1 = arrColorGray[1];
p = (y + 100) / 100;
} else {
c0 = arrColorGray[1];
c1 = arrColorGray[2];
p = y / 100;
}
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);
paintCenter.setColor(Color.argb(a, r, g, b));
mRedrawHSV = false;
if (l != null) {
l.onColorBack(a, r, g, b);
}
invalidate();
}
break;
}
case MotionEvent.ACTION_UP: {
if (IsPressCenter) {
IsPressCenter = false;
invalidate();
}
break;
}
}
return true;
}
public Paint getpaintCirclePhantom() {
return paintCirclePhantom;
}
public void setpaintCirclePhantom(Paint paintCirclePhantom) {
this.paintCirclePhantom = paintCirclePhantom;
}
public Paint getPaintCircle() {
return paintCircle;
}
public void setPaintCircle(Paint paintCircle) {
this.paintCircle = paintCircle;
}
public Paint getPaintCenterShadow() {
return paintCenterShadow;
}
public void setPaintCenterShadow(Paint paintCenterShadow) {
this.paintCenterShadow = paintCenterShadow;
}
public Paint getPaintCenter() {
return paintCenter;
}
public void setPaintCenter(Paint paintCenter) {
this.paintCenter = paintCenter;
}
public Paint getPaintGrayShadow() {
return paintGrayShadow;
}
public void setPaintGrayShadow(Paint paintGrayShadow) {
this.paintGrayShadow = paintGrayShadow;
}
public Paint getPaintGray() {
return paintGray;
}
public void setPaintGray(Paint paintGray) {
this.paintGray = paintGray;
}
public int[] getArrColorGray() {
return arrColorGray;
}
public void setArrColorGray(int[] arrColorGray) {
this.arrColorGray = arrColorGray;
}
public boolean ismRedrawHSV() {
return mRedrawHSV;
}
public void setmRedrawHSV(boolean mRedrawHSV) {
this.mRedrawHSV = mRedrawHSV;
}
public boolean isIsPressCenter() {
return IsPressCenter;
}
public void setIsPressCenter(boolean isPressCenter) {
IsPressCenter = isPressCenter;
}
public boolean isIsMoveCenter() {
return IsMoveCenter;
}
public void setIsMoveCenter(boolean isMoveCenter) {
IsMoveCenter = isMoveCenter;
}
public int[] getArrColorCircle() {
return arrColorCircle;
}
public String getStrColor() {
return strColor;
}
public void setStrColor(String strColor) {
this.strColor = strColor;
}
public double getZoom() {
return Zoom;
}
public void setZoom(double zoom) {
Zoom = zoom;
}
public void setOnColorBackListener(OnColorBackListener l) {
this.l = l;
}
public interface OnColorBackListener {
public void onColorBack(int a, int r, int g, int b);
}
}
주의:1.ColorPickerView 는 두 가지 구조 방법 을 다시 썼 습 니 다.첫 번 째 ColorPickerView(context)방법 으로 만 든 색상 채취 기 는 기본적으로 화면 밀도 보다 크기 가 크 고 기본 색상 은 흰색 입 니 다.두 번 째 ColorPickerView(context,color,zoom)color 는 기본 색상 이 고 zoom 은 크기 비율 을 그립 니 다.
2.colorPickerView 의 setOnColorBackListener 방법 으로 색상 의 변 화 를 감청 하고 a r g b 0~255 의 값 을 되 돌려 줍 니 다.colorPickerView.getStrColor()rgb 에 대응 하 는 16 진수 값 을 가 져 옵 니 다.예 를 들 어\#FF00FF
다운로드 체험 해 보 세 요~!
demo 다운로드 주소:AndroidStudio 프로젝트:ColorPicker!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.