Android自定义音量调节
2016-09-20 18:49
232 查看
先看实现的图形界面如下
这是初始状态,通过上下滑动,改变这些小块的颜色
代码实现如下
资源文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="firstColor" format="color"/>
<attr name="secondColor" format="color"/>
<attr name="circleWidth" format="dimension"/>
<declare-styleable name="CustomView">
<attr name="firstColor"/>
<attr name="secondColor"/>
<attr name="circleWidth"/>
</declare-styleable>
</resources>
自定义类
public class CustomView extends View {
private int mFirstColor;
private int mSecondColor;
private int mCircleWidth;
private Paint mPaint,paint;
private int j=0;
public CustomView(Context context) {
this(context, null);
}
public CustomView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a=context.getTheme().obtainStyledAttributes(attrs,R.styleable.CustomView,defStyleAttr,0);
int n=a.getIndexCount();
for(int i=0;i<n;i++){
int attr=a.getIndex(i);
switch(attr)
{
case R.styleable.CustomView_firstColor:
mFirstColor=a.getColor(attr,Color.BLACK);
break;
case R.styleable.CustomView_secondColor:
mSecondColor=a.getColor(attr, Color.BLACK);
break;
case R.styleable.CustomView_circleWidth:
mCircleWidth=a.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,16,getResources().getDisplayMetrics()));
break;
}
}
a.recycle();
mPaint=new Paint();
paint=new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
int centre=getWidth()/2;
int centre2=getHeight()/2;
int radius=centre-mCircleWidth/2;//半径
mPaint.setStrokeWidth(mCircleWidth);//设置线宽
mPaint.setAntiAlias(true);//消除锯齿
mPaint.setStyle(Paint.Style.STROKE);//设置为空心
mPaint.setStrokeCap(Paint.Cap.ROUND);//设置为线段形状为圆头
//设定一个圆弧的边界矩形
RectF oval=new RectF(centre-radius,centre2-radius,centre+radius,centre2+radius);
mPaint.setColor(mFirstColor);
//注意这个设置的线宽是以半径长度为中线,两边扩展
// canvas.drawCircle(centre, centre2, radius, mPaint);
for(int i=0;i<12;i++){
canvas.drawArc(oval, (270+30*i)%360, 10, false, mPaint);
}
// canvas.drawArc(oval, 270, 10, false, mPaint);
// canvas.drawArc(oval, 300, 10, false, mPaint);
if(j<0)j=0;
j=j%13;
mPaint.setColor(mSecondColor);
for(int k=0;k<j;k++){
canvas.drawArc(oval,(270+30*k)%360,10,false,mPaint);
}
paint.setColor(Color.LTGRAY);
paint.setStrokeWidth(10);//设置线宽
paint.setStrokeCap(Paint.Cap.ROUND);//设置为线段形状为圆头
canvas.drawLine(centre - 100, centre2 - 50, centre - 100, centre2 + 50, paint);
canvas.drawLine(centre - 100, centre2 - 50, centre - 50, centre2 - 50, paint);
canvas.drawLine(centre - 50, centre2 - 50, centre + 20, centre2 - 100, paint);
canvas.drawLine(centre - 100, centre2 + 50, centre - 50, centre2 + 50, paint);
canvas.drawLine(centre-50,centre2+50,centre+20,centre2+100,paint);
canvas.drawLine(centre+20,centre2-100,centre+20,centre2+100,paint);
canvas.drawLine(centre+40,centre2-50,centre+100,centre2-100,paint);
canvas.drawLine(centre+40,centre2,centre+100,centre2,paint);
canvas.drawLine(centre+40,centre2+50,centre+100,centre2+100,paint);
}
private int xDown,xUp;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
xDown=(int)event.getY();
break;
case MotionEvent.ACTION_UP:
xUp=(int)event.getY();
if(xUp>xDown){
j++;
}else{
j--;
}
postInvalidate();//对于这个还有一点不理解,为什么不直接调用draw呢,而且也没有开启线程吧,为什么不能调用Invalidate()
break;
}
return true;
}
}
在布局中引用
<com.example.administrator.musicplay.CustomView
android:layout_width="match_parent"
android:layout_height="match_parent"
custom:circleWidth="30dp"
custom:firstColor="#D4F668"
custom:secondColor="#2F9DD2"
/>
这是初始状态,通过上下滑动,改变这些小块的颜色
代码实现如下
资源文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="firstColor" format="color"/>
<attr name="secondColor" format="color"/>
<attr name="circleWidth" format="dimension"/>
<declare-styleable name="CustomView">
<attr name="firstColor"/>
<attr name="secondColor"/>
<attr name="circleWidth"/>
</declare-styleable>
</resources>
自定义类
public class CustomView extends View {
private int mFirstColor;
private int mSecondColor;
private int mCircleWidth;
private Paint mPaint,paint;
private int j=0;
public CustomView(Context context) {
this(context, null);
}
public CustomView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a=context.getTheme().obtainStyledAttributes(attrs,R.styleable.CustomView,defStyleAttr,0);
int n=a.getIndexCount();
for(int i=0;i<n;i++){
int attr=a.getIndex(i);
switch(attr)
{
case R.styleable.CustomView_firstColor:
mFirstColor=a.getColor(attr,Color.BLACK);
break;
case R.styleable.CustomView_secondColor:
mSecondColor=a.getColor(attr, Color.BLACK);
break;
case R.styleable.CustomView_circleWidth:
mCircleWidth=a.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,16,getResources().getDisplayMetrics()));
break;
}
}
a.recycle();
mPaint=new Paint();
paint=new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
int centre=getWidth()/2;
int centre2=getHeight()/2;
int radius=centre-mCircleWidth/2;//半径
mPaint.setStrokeWidth(mCircleWidth);//设置线宽
mPaint.setAntiAlias(true);//消除锯齿
mPaint.setStyle(Paint.Style.STROKE);//设置为空心
mPaint.setStrokeCap(Paint.Cap.ROUND);//设置为线段形状为圆头
//设定一个圆弧的边界矩形
RectF oval=new RectF(centre-radius,centre2-radius,centre+radius,centre2+radius);
mPaint.setColor(mFirstColor);
//注意这个设置的线宽是以半径长度为中线,两边扩展
// canvas.drawCircle(centre, centre2, radius, mPaint);
for(int i=0;i<12;i++){
canvas.drawArc(oval, (270+30*i)%360, 10, false, mPaint);
}
// canvas.drawArc(oval, 270, 10, false, mPaint);
// canvas.drawArc(oval, 300, 10, false, mPaint);
if(j<0)j=0;
j=j%13;
mPaint.setColor(mSecondColor);
for(int k=0;k<j;k++){
canvas.drawArc(oval,(270+30*k)%360,10,false,mPaint);
}
paint.setColor(Color.LTGRAY);
paint.setStrokeWidth(10);//设置线宽
paint.setStrokeCap(Paint.Cap.ROUND);//设置为线段形状为圆头
canvas.drawLine(centre - 100, centre2 - 50, centre - 100, centre2 + 50, paint);
canvas.drawLine(centre - 100, centre2 - 50, centre - 50, centre2 - 50, paint);
canvas.drawLine(centre - 50, centre2 - 50, centre + 20, centre2 - 100, paint);
canvas.drawLine(centre - 100, centre2 + 50, centre - 50, centre2 + 50, paint);
canvas.drawLine(centre-50,centre2+50,centre+20,centre2+100,paint);
canvas.drawLine(centre+20,centre2-100,centre+20,centre2+100,paint);
canvas.drawLine(centre+40,centre2-50,centre+100,centre2-100,paint);
canvas.drawLine(centre+40,centre2,centre+100,centre2,paint);
canvas.drawLine(centre+40,centre2+50,centre+100,centre2+100,paint);
}
private int xDown,xUp;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
xDown=(int)event.getY();
break;
case MotionEvent.ACTION_UP:
xUp=(int)event.getY();
if(xUp>xDown){
j++;
}else{
j--;
}
postInvalidate();//对于这个还有一点不理解,为什么不直接调用draw呢,而且也没有开启线程吧,为什么不能调用Invalidate()
break;
}
return true;
}
}
在布局中引用
<com.example.administrator.musicplay.CustomView
android:layout_width="match_parent"
android:layout_height="match_parent"
custom:circleWidth="30dp"
custom:firstColor="#D4F668"
custom:secondColor="#2F9DD2"
/>
相关文章推荐
- Android 7.0 四大新改进
- [置顶] 使用adb查看android程序的包名以及栈顶的activity名
- Android之View的事件体系
- Android Bitmap 和 ByteArray的互相转换
- android 解决输入法键盘遮盖布局问题(不适合带listview的布局)
- use addr2line in android
- Android--Dialog
- NFC 基础知识(NFC Basics) 根据官网个人翻译
- a ae46 ndroid第一篇:inputType的常用取值
- Android一点 修改jar的内容
- Android 应用程序集成FaceBook 登录及二次封装
- Android AsyncTask异步任务的使用
- Android Facebook和Twitter登录和分享完整版
- 常用控件含义,属性,继承关系
- Android——IPC机制(二)进程间通信方式
- android的SparseArray
- android的logcat的字符长度的限制,超过将直接截断
- Android——IPC机制(一)IPC概念以及Binder机制
- Android Studio快捷键指南(本文持续更新)
- Android——Activity生命周期与启动模式