안 드 로 이 드 는 두 원점 사 이 를 오 가 며 로 딩 진 도 를 실현 합 니 다.
머리말
요즘 은 사용자 정의 컨트롤 을 좋아 하고 심 플 하고 재 미 있 는 컨트롤 을 실현 하 는 것 을 좋아 합 니 다.예전 에 배 운 지식 을 공 고 히 하고 새로운 지식 을 계속 공부 하 는 것 도 좋 습 니 다.프로그래머 는 늙 을 때 까지 배 웁 니 다.
이 글 은 다음 글 에서 다음 과 같다Android_사용자 정의 컨트롤 의 수평 원점 로드 진도 바비슷 한 실현 방식 은 모두 비교적 간단 한 view 로 그 려 진 것 이다.
실현
먼저 실현 효 과 를 살 펴 보 자.
실현 방향:원점 x 축 은 변위 변 화 량 이 있 습 니 다.변위 가 원점 직경+원점 간격 에 이 르 면 방향 을 바 꿉 니 다(방향 을 바 꾸 는 것 은 변 화 량 치가 계속 증가 하고 계속 감소 함으로써 실현 하 는 것 입 니 다).약간 모호 하 게 쓸 수 있 습 니 다.그 다음 에 코드 를 보 겠 습 니 다.
package com.kincai.testcustomview_dotalternatelyprogress;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
* Copyright (C) 2015 The KINCAI Open Source Project
* .
* Create By KINCAI
* .
* Time 2017-06-16 21:44
* .
* Desc
*/
public class DotAlternatelyView extends View {
private final String TAG = this.getClass().getSimpleName();
private Paint mPaint = new Paint();
/**
*
*/
private int mLeftColor;
/**
*
*/
private int mRightColor;
/**
*
*/
private int mDotRadius;
/**
*
*/
private int mDotSpacing;
/**
*
*/
private float mMoveDistance;
/**
*
*/
private float mMoveRate;
/**
*
*/
private final int DOT_STATUS_RIGHT = 0X101;
/**
* -
*/
private final int DOT_STATUS_LEFT = 0X102;
/**
* ,
*/
private int mDotChangeStatus = DOT_STATUS_RIGHT;
/**
* ( 255-mAlphaChangeTotal 255 )
*/
private int mAlphaChangeTotal = 130;
/**
*
*/
private float mAlphaChangeRate;
/**
*
*/
private float mAlphaChange;
public DotAlternatelyView(Context context) {
this(context, null);
}
public DotAlternatelyView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public DotAlternatelyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DotAlternatelyView, defStyleAttr, 0);
initAttributes(typedArray);
typedArray.recycle();
init();
}
private void initAttributes(TypedArray Attributes) {
mLeftColor = Attributes.getColor(R.styleable.DotAlternatelyView_dot_dark_color, ContextCompat.getColor(getContext(), R.color.colorPrimary));
mRightColor = Attributes.getColor(R.styleable.DotAlternatelyView_dot_light_color, ContextCompat.getColor(getContext(), R.color.colorAccent));
mDotRadius = Attributes.getDimensionPixelSize(R.styleable.DotAlternatelyView_dot_radius, DensityUtils.dp2px(getContext(), 3));
mDotSpacing = Attributes.getDimensionPixelSize(R.styleable.DotAlternatelyView_dot_spacing, DensityUtils.dp2px(getContext(), 6));
mMoveRate = Attributes.getFloat(R.styleable.DotAlternatelyView_dot_move_rate, 1.2f);
}
/**
*
*/
private void init() {
// / = alpha /x
//x = * alpha /
mAlphaChangeRate = mMoveRate * mAlphaChangeTotal / (mDotRadius * 2 + mDotSpacing);
mPaint.setColor(mLeftColor);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.FILL);
Log.e(TAG, " aaaa " + mAlphaChangeRate);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
if (widthMode == MeasureSpec.EXACTLY) {
width = widthSize;
Log.e(TAG, "onMeasure MeasureSpec.EXACTLY widthSize=" + widthSize);
} else {
// ,
width = (mDotRadius * 2) * 2 + mDotSpacing;
Log.e(TAG, "onMeasure no MeasureSpec.EXACTLY widthSize=" + widthSize + " width=" + width);
if (widthMode == MeasureSpec.AT_MOST) {
width = Math.min(width, widthSize);
Log.e(TAG, "onMeasure MeasureSpec.AT_MOST width=" + width);
}
}
if (heightMode == MeasureSpec.EXACTLY) {
height = heightSize;
Log.e(TAG, "onMeasure MeasureSpec.EXACTLY heightSize=" + heightSize);
} else {
height = mDotRadius * 2;
Log.e(TAG, "onMeasure no MeasureSpec.EXACTLY heightSize=" + heightSize + " height=" + height);
if (heightMode == MeasureSpec.AT_MOST) {
height = Math.min(height, heightSize);
Log.e(TAG, "onMeasure MeasureSpec.AT_MOST height=" + height);
}
}
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
// x
int startPointX = getWidth() / 2 - (2 * mDotRadius * 2 + mDotSpacing) / 2 + mDotRadius;
// y
int startPointY = getHeight() / 2;
//
if (mDotChangeStatus == DOT_STATUS_RIGHT) {
mMoveDistance += mMoveRate;
mAlphaChange += mAlphaChangeRate;
} else {
mAlphaChange -= mAlphaChangeRate;
mMoveDistance -= mMoveRate;
}
Log.e(TAG, "mAlphaChange " + mAlphaChange);
//
if (mMoveDistance >= mDotRadius * 2 + mDotSpacing && mDotChangeStatus == DOT_STATUS_RIGHT) {
mDotChangeStatus = DOT_STATUS_LEFT;
mMoveDistance = mDotRadius * 2 + mDotSpacing;
mAlphaChange = mAlphaChangeTotal;
} else if (mMoveDistance <= 0 && mDotChangeStatus == DOT_STATUS_LEFT) { //
mDotChangeStatus = DOT_STATUS_RIGHT;
mMoveDistance = 0f;
mAlphaChange = 0f;
}
// mLeftColor mRightColor
mPaint.setColor(mLeftColor);
mPaint.setAlpha((int) (255 - mAlphaChange));
canvas.drawCircle(startPointX + mMoveDistance, startPointY, mDotRadius, mPaint);
mPaint.setColor(mRightColor);
mPaint.setAlpha((int) (255 - mAlphaChange));
canvas.drawCircle(startPointX + mDotRadius * 2 - mMoveDistance + mDotSpacing, startPointY, mDotRadius, mPaint);
invalidate();
}
}
이해 하기 어 려 우 면 원본 코드 를 다운로드 하고 실행 한 다음 원본 코드 를 보면 이해 하기 쉽다.원본 다운로드 github:Android 이동 로드 진도
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.