仿新浪微盾客户端项目简介五

简介:

这节中,我们我们来讨论微盾上界面上实现的二三事。这也是这个项目的重头戏。

界面上我们要做一个什么效果,一个倒计时的效果了,这个倒计时效果以后用的很多,希望对大家有帮助。

我这里布局方式用到了帧布局的方式,一个是所谓的表盘的情况,一个是倒计时的秒针, 相应的布局文件如下了:


<FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" >

        <com.itcast.vdunx.RingView
            android:layout_width="@dimen/ring_view_width"
            android:layout_height="@dimen/ring_view_height" >
        </com.itcast.vdunx.RingView>

        <com.itcast.vdunx.CountdownIndicator
            android:id="@+id/pb_progress"
            android:layout_width="@dimen/countdown_indicator_width"
            android:layout_height="@dimen/countdown_indicator_height"
            android:layout_gravity="center" >
        </com.itcast.vdunx.CountdownIndicator>
    </FrameLayout>

那个RingView是我自定义的表盘控件,它即在手机的界面上画了一个园,而这个CountdownIndicator即是一个倒计时控件,它是一个什么,一个扇形,一个随着时间的变化而不断改变自己大小的扇形。这两个控件的原理是什么了,我们来窥探它一下原貌了。

首先看一下RingVieW的源代码:


  Paint paint;
    Context ctx;
    public RingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        this.paint.setAntiAlias(true);//没有锯齿
        this.paint.setStyle(Paint.Style.STROKE);//画空心
        ctx = context;
    }
    
    @Override
    protected void onDraw(Canvas paramCanvas) {
        float center = getWidth()/2;
        int innerCircle = dip2px(ctx,83); //设置内圆半径
        int ringWidth = dip2px(ctx,5);  //设置圆环宽度
        
        //绘制内圆
        this.paint.setARGB(155, 167, 190, 206);
        this.paint.setStrokeWidth(2);//设置线条宽度
        paramCanvas.drawCircle(center,center, innerCircle, this.paint);//innerCircle:半径

        //绘制圆环
        this.paint.setARGB(255, 212 ,225, 233);
        this.paint.setStrokeWidth(ringWidth);//中间圆环宽度
        paramCanvas.drawCircle(center,center, innerCircle+1+ringWidth/2, this.paint);

        //绘制外圆
        this.paint.setARGB(155, 167, 190, 206);
        this.paint.setStrokeWidth(2);
        paramCanvas.drawCircle(center,center, innerCircle+ringWidth, this.paint);
    }

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

通过上面的源代码,我们可以清晰看出来了,这个只是通过相应画笔在指定的圆心位置按照固定位置来画出来相应的圆环。

而CountdownIndicator控件则比上述的控件园复杂一点了,首先还是看代码:


public class CountdownIndicator extends View {
    Paint paint;
    double phase;

    public CountdownIndicator(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.paint = new Paint();
        this.paint.setAntiAlias(true);

        // 在此处无法直接获得控件的宽高,只能从资源文件中读取
        float x = context.getResources().getDimension(
                R.dimen.countdown_indicator_width) / 2;// 返回的是像素值
        float y = context.getResources().getDimension(
                R.dimen.countdown_indicator_height) / 2;

        RadialGradient rg = new RadialGradient(x, y, y, Color.argb(255,
                143, 201, 233), Color.argb(255, 166, 212, 235), TileMode.MIRROR);// 渐变
        this.paint.setShader(rg);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        float f1 = (float) (phase * 360);
        float f2 = 270 - f1;
        RectF localRectF = new RectF(0, 0, getWidth(), getHeight());
        canvas.drawArc(localRectF, f2, f1, true, paint);// f2:起始角度,f1:扫描幅度
    }

    public void setPhase(double phase) {
        if (phase < 0 || phase > 1) {
            throw new IllegalArgumentException();
        }
        this.phase = phase;
        invalidate();
    }

这个类主要就是Phase这个角度,而他扫描的幅度这是一个起始角度,起始角度是一个o-1的浮点数*360,而相应的扫描的幅度根据相应数据三角函数的方法是270-起始角度了,这样就得到一个倒计时秒盘的结果。

有了这两个类之后,根据相应的时间控件计时之后,最终的计时的效果是这样的:

这个动画制作过程大家明白吧。




目录
相关文章
|
2月前
SAP UI5 应用如何实现类似百度首页一样的访问方式试读版
SAP UI5 应用如何实现类似百度首页一样的访问方式试读版
35 0
|
5月前
|
C++
C++实战-仿QQ项目终端版通信
C++实战-仿QQ项目终端版通信
37 0
|
存储 NoSQL 安全
取代微信?RocketChat开源聊天应用搭建教程
取代微信?RocketChat开源聊天应用搭建教程
取代微信?RocketChat开源聊天应用搭建教程
|
8月前
|
前端开发
仿qq音乐官网部分静态页面
仿qq音乐官网部分静态页面
76 0
|
9月前
|
移动开发 前端开发 JavaScript
基于springboot的仿今日头条系统「系统+文档开源」
Spring Boot+Mybatis+thymeleaf开发的高仿今日头条新闻网站 使用说明 项目描述: 仿照今日头条的WEB端toutiao.com做的一个Java web项目。 使用SpringBoot+Mybatis+thymeleaf开发。 前端使用bootstrap、html5、css3动画、jQuery、WangEditor富文本编辑器、Webuoloader和Base64处理图片上传、ajax异步处理表单数据,包括后台管理系统 运行环境: jdk8+tomcat7+mysql+IntelliJ IDEA+maven 项目技术: spring boot+spring mvc
仿QQ聊天室【方案】
仿QQ聊天室【方案】
103 0
|
搜索推荐 小程序 数据挖掘
仿今日头条实时新闻微信小程序项目源码
仿今日头条实时新闻微信小程序项目源码
330 0
仿今日头条实时新闻微信小程序项目源码
|
JavaScript 前端开发
仿网易云项目笔记
仿网易云项目笔记
127 0
|
前端开发 JavaScript
精讲前端实战项目之移动端网易云首页(附源码)
精讲前端实战项目之移动端网易云首页(附源码)
839 0
精讲前端实战项目之移动端网易云首页(附源码)
|
前端开发 JavaScript 存储
【VIP视频网站项目二】搭建爱奇艺优酷腾讯视频官网首页轮播图效果及实现原理分析
版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/82623992 ...
2174 0