首先总结一下本周的android课程,首先讲的是自定义控件,主要内容是用安卓自带的空间去继承view或者空间或者布局,然后再自定义中做出需求的空间,其中主要用到了ondraw等等的方法,具体的用法后面会附上。
接着讲的是非常重要的fragment,它被称作为嵌入在活动当中的UI,它能让程序更加合理和充分的利用好屏幕的空间资源还有更好的使用体验,一般用在平板上比较普遍,接着讲到的是Handle和message之间的应用,好的,接下来就是用案例来解析本周的知识点。
第一件的是自定义控件,首先本周的课程作业要求的的会出以个圆环并且圆环上附带进度条的作用,这周我没有用到progressbar而是直接用自定义控件来实现,代码如下
public class OwmActivity extends View
public OwmActivity(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public OwmActivity(Context context) {
this(context,null);
}
public OwmActivity(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context,attrs);
}
首先要用到一个自定义的Activitu去继承一个view,当然也可以继承控件或者布局,这里的使用要根据需求来定,解析一下代码,首先改写了三个构造方法,当使用到第一个构造方法的时候它会调用第二个,调用第二个的时候会调用第三个,所以我们把初始化放在第三个构造方法上。
接下来是实现一个带进度功能的圆环,这里我使用的是最简便的方法来实现的
private void init(Context context,AttributeSet attrs) {
mPaint = new Paint();
mRectF = new RectF();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.WHITE);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth((float)10.0);
mPaint.setStyle(Paint.Style.STROKE);
mRectF.left=getWidth()/2-getWidth()/3+20;
mRectF.top=getWidth()/2-35-getWidth()/3+20;
mRectF.right=getWidth()/2+getWidth()/3+20;
mRectF.bottom=getWidth()/2-35+getWidth()/3+20;
canvas.drawArc(mRectF,-90,360,false,mPaint);
mPaint.setColor(Color.RED);
canvas.drawArc(mRectF,-90,((float)mProgress/60)*360,false,mPaint);
}
}
解析一下代码这里用到了onDraw的方法,定义了画笔,然后开始画圆环,其中setAntiAlias(true)为去齿轮,setStrokeWidth设定换的粗细,
mRectF.left=getWidth()/2-getWidth()/3+20; mRectF.top=getWidth()/2-35-getWidth()/3+20; mRectF.right=getWidth()/2+getWidth()/3+20;
mRectF.bottom=getWidth()/2-35+getWidth()/3+20;上面的代码为定义圆环的上下左右的位置,开始画出一个白色背景的圆环,然后把画笔颜色改为红色,然后用红色代表进度。解析一下canvas.drawArc(mRectF,-90,360,false,mPaint);,其中第一个参数代表位置,第二和第三个参数代表初始和末尾圆环的角度,false代表没有圆心道边的两条边。最后设置一个进度mProgress,设定最大数为60(作业要求,之后可以改)
public void setProgress(int progress){
this.mProgress=progress;
this.postInvalidate();
}
最后设置一个设置progress的方法。
完成了第一部分,接下来讲的是handle和message的用法,也是以作业为例子,我使用的方法都是比较简便的。
首先我用到的开始和暂停button是同一个button
mStar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mHandler.removeMessages(1);
String name=mStar.getText().toString();
if (name.equals("start")){
mHandler.sendEmptyMessage(1);//1代表课堂上使用的msg.what
isstop = false;
mStar.setText("pause");
}else {
mHandler.sendEmptyMessage(0);
isstop=true;
mStar.setText("start");
}
}
});
//接收的hangdle
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
if(!isstop){
updateView();
mHandler.sendEmptyMessageDelayed(1,10);
}
break;
case 0:
break;
}
}
};
用名字到控制是否发送消息,超级方便。其他的重置和记录按钮就不写上来了。接下来写一下秒表的毫秒和秒。
private void updateView(){
timeusedinsec=timeusedinsec+1;
mSecond = (int)(timeusedinsec/100)%60;
mOwmActivity.setProgress(mSecond);
mMinsec = (int)(timeusedinsec)%100;
if (mSecond <10){
mSecondText.setText("00"+ mSecond);
}else {
mSecondText.setText("0"+ mSecond);
}
if (mMinsec <10){
mMinsecText.setText("0"+ mMinsec);
}else {
mMinsecText.setText(""+ mMinsec);
}
当接受到消息时就会调用updateView()这个方法,每一次毫秒数都加一,设置一下毫秒和秒的关系和设置一下秒表的格式就可以了。
好了本周的笔记到这里,虽然只是实现了很少的功能,但写起来还是非常慢的,因为我想用最少的代码来实现这些功能,希望下一次能把代码写得更好。