Android 사용자 정의 view 추첨 룰렛 만 들 기
효과 도
TurntableActivity
package com.bawei.myapplication.turntable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.RotateAnimation;
import com.bawei.myapplication.R;
import com.bawei.myapplication.turntable.CustomTurntableView;
/**
*
* @author hasee
*/
public class TurntableActivity extends AppCompatActivity {
CustomTurntableView customTurntableView;
boolean isTouchInSide = false;
float mDownX, mDownY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_turntable);
initView();
}
private void initView() {
customTurntableView = findViewById(R.id.custom);
// findViewById(R.id.custom_inside).setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// float degrees = (float)(720 + Math.random() * 1000);
// RotateAnimation rotateAnimation = new RotateAnimation(0, -degrees, 450, 450);
// rotateAnimation.setDuration(5000);
// rotateAnimation.setFillAfter(true);
// customCircleView.startAnimation(rotateAnimation);
// }
// });
findViewById(R.id.custom_inside).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN &&
event.getX() > 200 &&
event.getX() < 300 &&
event.getY() > 200 &&
event.getY() < 300) {
isTouchInSide = true;
mDownX = event.getX();
mDownY = event.getY();
return true;
}else if(event.getAction() == MotionEvent.ACTION_MOVE && (
event.getX() < mDownX -10 ||
event.getX() > mDownX + 10 ||
event.getY() < mDownY -10 ||
event.getY() > mDownY + 10) ){
isTouchInSide = false;
} else if (event.getAction() == MotionEvent.ACTION_UP &&
event.getX() > mDownX -10 &&
event.getX() < mDownX + 10 &&
event.getY() > mDownY -10 &&
event.getY() < mDownY + 10 &&
isTouchInSide) {
float degrees = (float) (720 + Math.random() * 1000);
RotateAnimation rotateAnimation = new RotateAnimation(0, -degrees, 250, 250);
rotateAnimation.setDuration(5000);
rotateAnimation.setFillAfter(true);
customTurntableView.startAnimation(rotateAnimation);
}
isTouchInSide = false;
return false;
}
});
}
}
대응 하 는 레이아웃
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<com.bawei.myapplication.turntable.CustomTurntableView
android:id="@+id/custom"
android:layout_width="wrap_content"
android:layout_height="500dp"
/>
<com.bawei.myapplication.turntable.CustomTurntableInsideView
android:id="@+id/custom_inside"
android:layout_width="wrap_content"
android:layout_height="500dp"
app:text=" "
android:background="#3300ff00" />
</RelativeLayout>
사용자 정의 TurntableView 계승 보기
package com.bawei.myapplication.turntable;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
/**
*
* @author hasee
*/
public class CustomTurntableView extends View{
Paint mPaint;
int mCircleCount = 6;
float mStartAngle = 0;
RectF rectF;
public CustomTurntableView(Context context) {
super(context);
init();
}
public CustomTurntableView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
private void init(){
mPaint = new Paint();
mPaint.setColor(Color.BLUE);
mPaint.setStrokeWidth(10);
mPaint.setTextSize(60);
mPaint.setStyle(Paint.Style.FILL);
rectF = new RectF();
rectF.top = 100;
rectF.left = 100;
rectF.right = 400;
rectF.bottom = 400;
}
String[] textColor = {" "," "," "," "," "," "};
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for(int i = 0; i < mCircleCount; i++){
// ,
if(i % 2 == 0 ){
mPaint.setColor(Color.BLUE);
}else{
mPaint.setColor(Color.GREEN);
}
canvas.drawArc(rectF, mStartAngle, 60, true, mPaint);
//
mPaint.setColor(Color.BLACK);
mPaint.setTextSize(20);
Path path = new Path();
path.addArc(rectF,mStartAngle+20,60);
canvas.drawTextOnPath(textColor[i],path,-10,40,mPaint);
mStartAngle += 60;
}
}
}
사용자 정의 Turntable InsideView 계승 보기
package com.bawei.myapplication.turntable;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import com.bawei.myapplication.R;
/**
*
* @author hasee
*/
public class CustomTurntableInsideView extends View {
/**
*
*/
Paint mPaint;
RectF mRectF;
String mStr;
public CustomTurntableInsideView(Context context) {
super(context);
init();
}
public CustomTurntableInsideView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
// , ( )
// : values attrs.xml
// : attrs.xml
// : layout xmlns:app="http://schemas.android.com/apk/res-auto"
// : app:" attrs attr name"=" "
// : , R.styleable. attrs declare-styleable name
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomTurntableView);
// : , attrs format, getXXX ,
// R.styleable. attrs declare-styleable name _ attrs attr name
mStr = typedArray.getString(R.styleable.CustomTurntableView_text);
init();
}
private void init() {
// CustomBingView
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(10);
mPaint.setTextSize(20);
mPaint.setStyle(Paint.Style.FILL);
mRectF = new RectF();
mRectF.top = 50;
mRectF.bottom = 300;
mRectF.right = 300;
mRectF.left = 200;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// setMeasuredDimension(300, 300);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// ,
mPaint.setColor(Color.BLACK);
// , ,
canvas.drawArc(mRectF, 60, 60, true, mPaint);
mPaint.setColor(Color.RED);
// ,
canvas.drawCircle(250, 250, 50, mPaint);
mPaint.setColor(Color.BLACK);
//
canvas.drawText(mStr, 230, 260, mPaint);
// , ,
// Path path = new Path();
// ,moveTo
// path.moveTo(300, 300);
// lineTo
// path.lineTo(300, 400);
// path.lineTo(400, 400);
//
// path.close();
//
// canvas.drawPath(path, mPaint);
}
}
사용자 정의 속성 attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- name -->
<declare-styleable name="CustomTurntableView">
<!-- name , , -->
<!-- format -->
<attr name="text" format="string"></attr>
</declare-styleable>
</resources>
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 지지 해 주시 고 저희 공중전화 의 더 많은 멋 진 내용 에 관심 을 가 져 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.