Android 사용자 지정 부채 카운트다운 인스턴스 코드
엄밀히 말하면, 난 안드로이드 흰둥이야, 쓴 목적은 단지 지식으로 비축하려는 것뿐이야...그러나 다른 사람이 부주의로 나의 이 편을 찾아올지도 모른다고 생각하면 만약 내가 간단한 묘사일 뿐이라면 다른 사람이 이해하지 못할 수도 있고, 어쩌면 또 나무라게 될지도 모른다. 그러면 억울하지 않겠는가?
그래서 나는 문제와 과정을 명확하게 묘사했다. 이것도 나 자신에 대한 설명이고 이것도 나의 첫 번째 편이다. 나는 그것을 잘 해야 한다.
먼저 요구 사항을 말하자면 최근에 업무 중에 카운트다운을 해야 한다. 동그랗고 천천히 먹히는 애니메이션 카운트다운이다. 자신의 지식이 충분하지 않기 때문에 Canvas로 그려야 한다는 것만 알고 인터넷에서 한 바퀴 뒤졌는데 정태적으로 부채꼴을 그렸거나 컨트롤의 위치 크기를 조절할 수 없다는 것을 발견했다.어쨌든 한 바퀴 돌면서 캔버스 지식을 많이 배운 것 같지만, 자신도 안드로이드 흰둥이이기 때문에그래서 그 중에서 내가 원하는 애니메이션의 부채꼴 카운트다운을 정리할 수 없다. (여기서 말하자면 내가 이 물건을 처음 사용해서 편집에 익숙하지 않아서 효과도를 보지 못한다. 그러나 이곳의 코드는 매우 간단하다. 필요한 친구는 직접 가져가서 네가 필요로 하는 효과인지 확인해 볼 수 있다).
마지막으로 나는 어쩔 수 없이 내 친구에게 가르침을 청했다. 지금은 그도 신을 말할 수 없지만, 나보다 훨씬 낫다......여기서 말하자면 나는 단지 그의 논리를 더 많이 옮겼을 뿐이다.. 부끄럽다.. 나는 단지 지식의 비축으로 삼고 싶었기 때문이다..
둘.본문
아까도 말했듯이Canvas를 사용하기 때문에 우리는 먼저 하나의 컨트롤을 사용자 정의하고View의 사용자 정의 컨트롤을 직접 계승한다.
SweepView.java:
public class SweepView extends View {
private static final int DEFAULT_WIDTH = 100;
private static final int DEFAULT_HEIGHT = 100;
private int mWidth; //
private int mHeight; //
private RectF rectF;
private Paint paint;
private int mColor = Color.RED;//
private float mSweep = 0; //
public SweepView(Context context) {
super(context);
init();
}
public SweepView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SweepView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint = new Paint();
paint.setColor(mColor); //
paint.setStyle(Paint.Style.FILL); //
paint.setAntiAlias(true); //
}
/**
*
* UIThred
*/
public void setColor(int color) {
this.mColor = color;
paint.setColor(mColor);
// onDraw
invalidate();
}
/**
* 0-360
* UIThred
*/
public void setSweep(float mSweep) {
this.mSweep = mSweep;
// onDraw
invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int resultWidth = measureWidth(widthMeasureSpec);
int resultHeight = measureHeight(heightMeasureSpec);
setMeasuredDimension(resultWidth, resultHeight);
}
/**
*
* , ... .....0.0
*/
private int measureWidth(int widthMeasureSpec) {
int size = MeasureSpec.getSize(widthMeasureSpec);
int mode = MeasureSpec.getMode(widthMeasureSpec);
int result;
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = DEFAULT_WIDTH;
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(size, DEFAULT_WIDTH);
}
}
return result;
}
/**
*
* , ... .....0.0
*/
private int measureHeight(int heightMeasureSpec) {
int size = MeasureSpec.getSize(heightMeasureSpec);
int mode = MeasureSpec.getMode(heightMeasureSpec);
int result;
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = DEFAULT_HEIGHT;
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(size, DEFAULT_HEIGHT);
}
}
return result;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
this.mHeight = h;
this.mWidth = w;
rectF = new RectF(0, 0, w, h);
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
protected void onDraw(Canvas canvas) {
//
canvas.drawArc(rectF, -90, mSweep, true, paint);
}
}
사용자 정의 View를 작성합니다. 분명히 우리는 그것을 사용해야 하기 때문에 레이아웃 파일에 다음과 같습니다. (단, 주의해야 할 것은, 위치와 크기를 조절하려면 View Group으로 싸야 합니다. View Group의 위치와 크기를 설정해서 컨트롤해야 합니다. 왜 그런지 저도 0.0을 알고 싶습니다.)
MainActivity.xml
마지막으로 코드에서 애니메이션 형태를 그리는 원형 부채형 카운트다운입니다.
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private SweepView sweepView;
float angle = 0;//
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sweepView = (SweepView) findViewById(R.id.sweepView);
sweepView.setColor(Color.WHITE); //
sweepView.setSweep(0); // 0
new Thread(new Runnable() {
@Override
public void run() {
while (angle <= 360) { // , 3.6 50, 5
angle += 3.6;
runOnUiThread(new Runnable() {
@Override
public void run() {
sweepView.setSweep(angle);
}
});
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
셋.총결산
사용자 정의view에서 저는 아직 잘 모르는 부분이 많습니다. 왜냐하면 사용자 정의에 대한 자신의 인식이 부족하기 때문입니다. 그러나 저는 앞으로 그 중의 몇 가지 방법의 의미를 천천히 알게 될 것이라고 생각합니다.물론 만약 친구가 부주의로 이 글을 볼 수 있다면, 네가 나에게 의혹을 풀 수 있기를 바란다. 대단히 고맙다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.