android 代码绘制转盘抽奖的实现
2015-10-12 21:17
603 查看
android 代码绘制转盘抽奖的实现
先上图
![](https://img-blog.csdn.net/20151012211144398?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
第一个是 整体的布局
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.util.AttributeSet;
import android.view.View;
public class MyView extends View {
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
private Paint mPaint;
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
mPaint = new Paint();
// 必选设定画笔属性
mPaint.setAntiAlias(false);// 抗锯齿
// 获取视图 宽和 高 便于 确定中心点
int w = getWidth();
int h = getHeight();
// 画 外边黄圆圈
mPaint.setColor(Color.YELLOW);
mPaint.setStyle(Paint.Style.STROKE);// 空心
mPaint.setStrokeWidth(30.0f);// 画笔粗
canvas.drawCircle(w / 2, h / 2, 320, mPaint);// 半径 350
// 第2个圈
mPaint.setARGB(255, 181, 28, 24);// 第一个参数是透明度 0是透明255 不透明
mPaint.setStrokeWidth(40.0f);// 画笔粗
canvas.drawCircle(w / 2, h / 2, 290, mPaint);// 半径 290
// 里边的实心小圆 分24分 15°一份
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(w / 2, h / 2 - 290, 10, mPaint);
for (int i = 0; i < 24; i++) {
canvas.save();
canvas.rotate(15 * i, w / 2, h / 2);
if (i % 2 == 0) {
mPaint.setColor(Color.BLUE);
} else
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(w / 2, h / 2 - 290, 10, mPaint);
canvas.restore();
}
RectF rectF3 = new RectF(w / 2 - 270, h / 2 - 270, w / 2 + 270,
h / 2 + 270);// 外切红圆圈的半径减去画笔一半
for (int i = 0; i < 8; i++) {
if (i%2==0) mPaint.setColor(Color.GREEN);
else mPaint.setColor(Color.YELLOW);
canvas.drawArc(rectF3, 45*i, 45, true, mPaint);
mPaint.setColor(Color.BLACK);
}
// 扇形
// 画弧线 参数 外切矩形 起始角度 终角度 是否封闭
//扇形上边写字
// 写一个转八次
Path path = new Path();
path.moveTo(w/2, h/2);
path.lineTo(w/2-100, w / 2 - 270);
path.close();
mPaint.setTextSize(42);
// 沿路径绘制图片
for (int j = 1; j < 9; j++) {
canvas.save();
canvas.rotate(45 * j, w / 2, h / 2);
canvas.drawTextOnPath(j+"等奖", path, 80, 0, mPaint);
canvas.restore();
}
//画箭头
canvas.restore();
mPaint.setStyle(Paint.Style.FILL);// 实心
mPaint.setStrokeWidth(8);//
mPaint.setColor(Color.RED);
Path path1 = new Path();
path1.moveTo(w/2-40, h/2);
path1.lineTo(w/2+30, h/2);
path1.lineTo(w/2, h/2-120);
path1.close();
canvas.drawPath(path1, mPaint);
// 最里层 实心园
mPaint.setColor(Color.CYAN);
mPaint.setStrokeWidth(2f);//
canvas.drawCircle(w / 2, h / 2, 60, mPaint);
}
}
最后一个Java文件 是第一个布局对应的。获取结果
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.RotateAnimation;
import android.widget.TextView;
import android.widget.Toast;
public class ChouActivity extends Activity {
TextView star;
MyView mView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chou);
star=(TextView) findViewById(R.id.start);
mView=(MyView) findViewById(R.id.myview);
star.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int min=1,max=359;
final int s=(new Random()).nextInt(max)%(max-min-1)+min;
RotateAnimation rotate = new RotateAnimation(0, 720+s,
Animation.ABSOLUTE, mView.getWidth() / 2,
Animation.ABSOLUTE, mView.getHeight() / 2);
rotate.setDuration(1500);
rotate.setFillAfter(true);
//rotate.setInterpolator(new LinearInterpolator());
mView.startAnimation(rotate);
rotate.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub 13591774480
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
int a=8-s/45;
Toast.makeText(getApplicationContext(), "恭喜您"+a+"等奖"+s, Toast.LENGTH_SHORT).show();
}
});
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.chou, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
算是自己写的比较完善的小DEMO吧。
加油
先上图
第一个是 整体的布局
<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" > <com.example.animationtest.MyView android:id="@+id/myview" android:layout_width="match_parent" android:layout_height="match_parent" /> <TextView android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="抽奖" android:layout_centerInParent="true" /> </RelativeLayout>第二个是 自定义View
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.util.AttributeSet;
import android.view.View;
public class MyView extends View {
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
private Paint mPaint;
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
mPaint = new Paint();
// 必选设定画笔属性
mPaint.setAntiAlias(false);// 抗锯齿
// 获取视图 宽和 高 便于 确定中心点
int w = getWidth();
int h = getHeight();
// 画 外边黄圆圈
mPaint.setColor(Color.YELLOW);
mPaint.setStyle(Paint.Style.STROKE);// 空心
mPaint.setStrokeWidth(30.0f);// 画笔粗
canvas.drawCircle(w / 2, h / 2, 320, mPaint);// 半径 350
// 第2个圈
mPaint.setARGB(255, 181, 28, 24);// 第一个参数是透明度 0是透明255 不透明
mPaint.setStrokeWidth(40.0f);// 画笔粗
canvas.drawCircle(w / 2, h / 2, 290, mPaint);// 半径 290
// 里边的实心小圆 分24分 15°一份
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(w / 2, h / 2 - 290, 10, mPaint);
for (int i = 0; i < 24; i++) {
canvas.save();
canvas.rotate(15 * i, w / 2, h / 2);
if (i % 2 == 0) {
mPaint.setColor(Color.BLUE);
} else
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(w / 2, h / 2 - 290, 10, mPaint);
canvas.restore();
}
RectF rectF3 = new RectF(w / 2 - 270, h / 2 - 270, w / 2 + 270,
h / 2 + 270);// 外切红圆圈的半径减去画笔一半
for (int i = 0; i < 8; i++) {
if (i%2==0) mPaint.setColor(Color.GREEN);
else mPaint.setColor(Color.YELLOW);
canvas.drawArc(rectF3, 45*i, 45, true, mPaint);
mPaint.setColor(Color.BLACK);
}
// 扇形
// 画弧线 参数 外切矩形 起始角度 终角度 是否封闭
//扇形上边写字
// 写一个转八次
Path path = new Path();
path.moveTo(w/2, h/2);
path.lineTo(w/2-100, w / 2 - 270);
path.close();
mPaint.setTextSize(42);
// 沿路径绘制图片
for (int j = 1; j < 9; j++) {
canvas.save();
canvas.rotate(45 * j, w / 2, h / 2);
canvas.drawTextOnPath(j+"等奖", path, 80, 0, mPaint);
canvas.restore();
}
//画箭头
canvas.restore();
mPaint.setStyle(Paint.Style.FILL);// 实心
mPaint.setStrokeWidth(8);//
mPaint.setColor(Color.RED);
Path path1 = new Path();
path1.moveTo(w/2-40, h/2);
path1.lineTo(w/2+30, h/2);
path1.lineTo(w/2, h/2-120);
path1.close();
canvas.drawPath(path1, mPaint);
// 最里层 实心园
mPaint.setColor(Color.CYAN);
mPaint.setStrokeWidth(2f);//
canvas.drawCircle(w / 2, h / 2, 60, mPaint);
}
}
最后一个Java文件 是第一个布局对应的。获取结果
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.RotateAnimation;
import android.widget.TextView;
import android.widget.Toast;
public class ChouActivity extends Activity {
TextView star;
MyView mView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chou);
star=(TextView) findViewById(R.id.start);
mView=(MyView) findViewById(R.id.myview);
star.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int min=1,max=359;
final int s=(new Random()).nextInt(max)%(max-min-1)+min;
RotateAnimation rotate = new RotateAnimation(0, 720+s,
Animation.ABSOLUTE, mView.getWidth() / 2,
Animation.ABSOLUTE, mView.getHeight() / 2);
rotate.setDuration(1500);
rotate.setFillAfter(true);
//rotate.setInterpolator(new LinearInterpolator());
mView.startAnimation(rotate);
rotate.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub 13591774480
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
int a=8-s/45;
Toast.makeText(getApplicationContext(), "恭喜您"+a+"等奖"+s, Toast.LENGTH_SHORT).show();
}
});
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.chou, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
算是自己写的比较完善的小DEMO吧。
加油
相关文章推荐
- android数据访问模式:档、SharedPreferences
- Android中自定义Adapter的基本原理
- Android开发调试中遇到的Waiting for HOME解决方案
- Android中Menu的基本用法
- android arcelable 传递 boolean值
- android view SurfaceView GLSurfaceView的关系和区别
- android源码编译出错(3)
- android事件分发机制
- Android笔记---LayoutInflater作用
- Android开发相关的Blog推荐——跟随大神的脚步才能成长为大神
- Android-多媒体编程
- Android中Adapter之BaseAdapter使用
- Android Service的使用解析
- Android Studio 发布APK以及获取SHA1和MD5值
- Android进阶笔记04:Android进程间通讯之Messenger ( 区别于AIDL)
- Android 利用广播实现指定号码的短信的拦截 附源码下载链接
- Android学习系列: 采用pull解析xml文件
- android 环绕TextView效果
- Android四大组件解析
- android 流量统计