2015-12-02 17:08:18 aishang5wpj 阅读数 916

来来来,先看看效果。

效果图

记得在学校学习的时候也写过一个C语言的手表,不过指针好像一直转不准,想想还是当年太年轻~囧~~
最近在研究canvas,看到某人写的例子里面也有只手表,今天便花了点时间自己重新写了一个,当是练手了。
例子本身没什么难的,初学者应该都看得懂。
首先拆分这个view:

  1. 手表的刻度和整点时刻是不变的,可以通过view的宽高直接画在中心
  2. 指针单独拿出来画,因为要计算角度

所以onDraw里面的内容是这样:

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        this.mTotalWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
        this.mTotalHeight = getMeasuredHeight() - getPaddingBottom() - getPaddingTop();

        int smallerSize = this.mTotalWidth < this.mTotalHeight ? this.mTotalWidth : mTotalHeight;
        mStandard = smallerSize >> 1;

        //将画布移至中心
        canvas.translate(getPaddingLeft() + this.mTotalWidth >> 1, getPaddingTop() + this.mTotalHeight >> 1);

        drawAppearance(canvas);

        drawTime(canvas);

        if (!mIsStop) {

            postInvalidateDelayed(INTERVAL_REFRESH);
        }
    }

第5、6行是为了计算padding;因为手表是圆形,所以表应该是画在一个长宽均为表的直径的正方形内,所以第8行取了view长度、宽度中的一个较小值。
同时为了保证view的扩展性,手表的半径、指针的长度等都没有写固定值,而是根据view 的大小按比例来计算的(mStandard即作为整个view其他部分的长度参考),所以你就能看到上面那个gif中有三种不同尺寸的大小,除了我改了下整点时刻的字体大小外,没有改过其他任何地方的一句代码。
如果你愿意,当然也可以把字体做成适配view大小的,或者干脆写一个属性,在布局文件中赋值然后再代码中获取。
第14行中,有个drawAppearance(canvas);方法,主要是画表的刻度等。

    /**
     * 画外观,包括刻度和整点时刻的文字
     */
    private void drawAppearance(Canvas canvas) {

        //表的半径为标准长度值的0.8,留点空隙
        float radius = mStandard * 0.8f;

        //只描边,不填充
        mPaint.setStyle(Paint.Style.STROKE);
        //画表的大圆
        canvas.drawCircle(0, 0, radius, mPaint);
        //画表的圆心
        canvas.drawCircle(0, 0, 5, mPaint);

        canvas.save();
        drawCalibration(canvas, radius);
        canvas.restore();
    }

可以看到,表的半径是上面那个mStandard值的0.8,第7行画表最外面的圆,第9行画圆心,12行开始画刻度。因为 drawCalibration(canvas, radius);方法中涉及到了canvas的旋转等操作,为了避免对后续的操作造成影响,所以在该方法的调用过后还原了那些操作,因此你可以看到有save、restore的调用。
画刻度的方法drawCalibration(canvas, radius);代码如下:

/**
     * 画刻度
     */
    private void drawCalibration(Canvas canvas, float radius) {

        //整点时刻文字的大小
        mPaint.setTextSize(DensityUtil.sp2px(mContext, TIME_NUMBER_SIZE));
        //使文字居中
        mPaint.setTextAlign(Paint.Align.CENTER);

        int calibrationHour = DensityUtil.dp2px(mContext, CALIBRATION_LENGTH_HOUR);
        int calibrationMinute = DensityUtil.dp2px(mContext, CALIBRATION_LENGTH_MINUTE);
        int diver = DensityUtil.dp2px(mContext, CALIBRATION_TEXT_DIVER);

        //使表的12点在正上方
        canvas.rotate(210);

        for (int i = 0; i < 60; i++) {

            int length = calibrationMinute;

            if (i % 5 == 0) {

                length = calibrationHour;
                canvas.drawText(i / 5 + 1 + "", 0, radius - CALIBRATION_LENGTH_HOUR - diver, mPaint);
            }
            canvas.drawLine(0, radius, 0, radius - length, mPaint);
            canvas.rotate(6, 0, 0);
        }
    }

可以看到第7行使用了工具类,将sp转成px。做过自定义控件的朋友应该都知道,直接写数值是不科学的,这样在不同屏幕上面的显示效果很差,无法适配,应该使用sp转换成px的方式来设置字体的大小。dp同理,其实和布局文件中使用dp、sp是一个道理。
下面画刻度的过程就是每次旋转画布6°,重复60次的过程。

类似于旋转等的这些操作就像是虽然你的笔还是原来的地方画,但是画纸旋转或者移动了,所以你画的东西的方位就产生变化。

对于后面的过程,聪明的你想必已经无需我多做解释了。
画完刻度画指针,来看onDraw方法中的drawTime:

    private void drawTime(final Canvas canvas) {

        Calendar calendar = Calendar.getInstance();

        canvas.save();

        drawPointer(canvas, calendar);
        drawDigitalTime(canvas, calendar);

        canvas.restore();
    }

这里有一个画指针时间和一个画数字时间的,先看drawPointer(canvas, calendar);

/**
     * 画指针
     */
    private void drawPointer(Canvas canvas, Calendar calendar) {

        canvas.save();
        canvas.rotate(270);

        int hour = calendar.get(Calendar.HOUR);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);

        //每小时所占的角度为30度
        float degree = (hour + minute / 60.0f) * 30;
        canvas.save();
        canvas.rotate(degree);
        canvas.drawLine(0, 0, mStandard * POINTER_LENGTH_HOUR, 0, mPaint);
        canvas.restore();

        //每分钟所占的角度为6度
        degree = (minute + second / 60.0f) * 6;
        canvas.save();
        canvas.rotate(degree);
        canvas.drawLine(0, 0, mStandard * POINTER_LENGTH_MINUTE, 0, mPaint);
        canvas.restore();

        //每秒钟所占的角度为6度
        degree = second * 6;
        canvas.save();
        canvas.rotate(degree);
        canvas.drawLine(0, 0, mStandard * POINTER_LENGTH_SECOND, 0, mPaint);
        canvas.restore();

        canvas.restore();
    }

第7行旋转了270°,为什么是270这个是试出来的,没仔细研究,有时间再看。
其他注释都写得很多了,没什么好说,就是每次旋转画完一个指针之后记得还原旋转的操作了,免得你转了几次之后自己都晕了。
下面是drawDigitalTime方法:

/**
     * 画当前时间的数字显示
     */
    private void drawDigitalTime(Canvas canvas, Calendar calendar) {

        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);

        String time = String.format("北京时间:%s:%s", hour, minute);
        Rect bound = new Rect();
        mPaint.getTextBounds(time, 0, time.length(), bound);
        if (mStandard > bound.width()) {

            canvas.drawText(time, 0, mTotalHeight >> 3, mPaint);
        }
    }

画数字时间之前先计算下字符串的宽度,如果宽度值比上面那个mStandard还大,那就不画那个数字时间了。

最后是view界面的刷新问题,一开始考虑在画指针的时候写个while循环然后每个多少秒刷新,但是会造成ui阻塞以及可能重叠等问题,后来想想其实直接调用invalidate就可以了,同时为了避免过度刷新,加了一个延迟刷新的操作,所以onDraw方法中18~21行中可以看到:

        if (!mIsStop) {

            postInvalidateDelayed(INTERVAL_REFRESH);
        }

代码在这里

end.

2010-11-14 15:09:00 salonwatch 阅读数 821

Rolex has become a well-known name in the area of watchmaking. As a matter of fact, this brand has created a niche segment for its time-pieces and accessories, thereby becoming one of the leading manufacturers of luxury watches in the world as of now. And as many of us are aware, everything that is good is copied and made available for greater and more wide-spread use. And designer time-pieces are no exception to this general trend. Consequently, imitation watches have made their foray into the hearts and minds of fashion conscious consumers and users the world over. A replica Rolex daytona is, for example,sale rolex watches, available for very affordable costs – and that too quite easily from some very reputed online retailing outlets. The quality is extraordinary with the replica Rolex watches living up to the reputation of the original ones.

 

It can be said with a lot of conviction that the imitation watches cater to the obsession of fashion conscious people who want to replicate the lives of the rich and the famous. They might want to sport a replica Rolex daytona, during a polo match, quite like the celebrities they see in films and fashion magazines. And with the availability of of these imitation watches, they can now realize quite a few of their wildest fantasies and see their dreams come true without spending astronomical amounts for the same.

 

Replica watch  Rolex daytona watches have been available since the mid eighties. These clever copies of the original Rolex model have also served a secondary purpose, apart from catering to the demand from upwardly mobile users They, for one, have whetted up the appetite of the users for originals as well. Those who have the purchasing power are now going ahead and trying to acquire the very best. And for the rest there were still the fake watches to fall back upon.

 

Grade 1 replica designer watches are available for some affordable costs; one could get rebate in the costs of these products depending on the specific quality that one is opting for. Made from high-grade materials, many of these models are very durable and capable of being put to regular use.

 

Replica watch Rolex watches are therefore a part of a new and very buoyant industry that is coming into place, even as we speak. Many people are opting for these imitation watches, knowing fully well what they are getting into. They know for a fact that the money that they are spending on these products would be more than compensated through the “feel good” vibes that they would be receiving from one and all, as and when they sport the same.

 

 

2014-08-12 21:31:01 XD_lixin 阅读数 1955

刚刚观看了一个ROLEX手表的宣传片,感觉很棒,整个视频制作运用了很多技巧,使得观众的接受度应该会非常高。

1.精美的画面

该宣传片的每一帧画面都非常精美,让人赏心悦目,即使知道是在看广告,也有兴趣把它看完,看广告也成了享受。


2.多焦点

在这份宣传片中,不知一次的出现一个画面中拥有多个焦点的情况,而且两个焦点并不是一成不变的或者拥有相同的地位,在下面的图片中可以看到,两块手表,一个大,一个小,一个完整展现,一个部分展现,一个作为画面主体出现,一个作为画面背景出现,相辅相成,互为补充。

需要说明的是:在多焦点技巧使用过程中,如果画面持续时间比较长,那么以两个焦点为宜,因为在这种情况下,观众长时间观看一个焦点就会感觉过于单一,两个焦点会提供给用户更大的信息量。三个焦点及多个焦点适合在画面持续时间较短的情况下展现,因为焦点过多,观众把握不住某一个,就会感觉到混乱,这种感觉持续时间如果比较短,观众会感觉比较炫,如果时间太长,观众就会感觉混乱。


3.用数据说话

用数据说话,会使得宣传视频让观众感觉展现有内容,有深度,而非简单的炫耀画面。

4.运用时间轴

运用时间轴讲解ROLEX发展历史,使得一段十分钟的宣传片变得有条理。同时,在过程中,可以运用大量的数据,是与“用数据说话”观点的结合。


5.展现细节

展现产品的精美细节,会给观众震撼的感觉,从心底发出赞美。在风景片人物篇中,展现细节同样重要。


2019-10-11 22:58:36 WPSJ01 阅读数 30

各位朋友大家好,我是腕品视界,专注于腕表的拆解评测的自媒体人,定时定期的分享原创的腕表真假对比,拆解图文,用知识为您在玩表之路保驾护航。今天带来的评测是AR新款劳力士绿玻璃闪电针,在之前所有版本之上再次升级。在这里插入图片描述
劳力士绿水鬼有多火,我不必多说大家都知道。火爆款不好的地方在哪呢?就在于买的人多,佩戴率高,那“撞表”的人就很多,有些朋友不愿“被撞表”但又非常喜欢绿色劳力士款,那怎么办呢?不如换换“口味”,劳力士绿玻璃闪电针颜值一点儿都不输绿水鬼,是很不错的选择。
在这里插入图片描述
直径40mm,表壳采用904钢,绿玻璃镀膜骚气十足,深蓝色的表盘带有放射纹,不同角度下呈现不同的质感。表盘内的字体、十二点钟下方劳力士英文都采用3D立体印刷油压印刷而成,包括间距粗细和原装一样。有人说绿玻璃闪电针是最不像劳力士的劳力士,为什么这么说呢,因为它没有劳力士招牌的小窗凸透镜,也没有三角坑纹圈,劳力士六点钟处隐藏的小皇冠也没有。因为它的玻璃构造不同,与其他劳力士的玻璃完全不一样,所以六点钟处没有隐形小皇冠,这点和原装是一样的。
在这里插入图片描述
盘内刻度以及指针采用K金材质,抛光打磨得非常光滑,并且附有夜光图层,搭配橙色闪电形秒针,整体的色调充满活力和动感。橙色闪电形秒针颜色很正,秒针尖端的三角形最长的边,并不是一个横的直线,是有一个轻微的向上弯的幅度,这一点和原装一致,小细节处可见AR的用心。在这里插入图片描述
侧面采用旋入式把头,保证防水性能发挥到极致,把头上经典劳力士皇冠标识,清晰深刻,把头边缘齿轮打磨光滑,整体表壳都采用904钢。在这里插入图片描述
底盖采用密底设计,中间是纯拉丝工艺,简单明了。波浪齿轮的打磨非常细腻,间距大小都与原装一致。底盖边缘四个方向的劳力士标志与字母都非常清晰,刻度也很深,细节把握很到位。机芯采用3132机芯,调时与原装一致,顺时针调节。在这里插入图片描述
表带采用904精钢,是拉丝工艺和抛光工艺的结合,每节表带之间的接触部分都有圆弧形的打磨,搭配原装折叠扣,酷炫十足。在这里插入图片描述
在这里插入图片描述最后看下上手图,帅帅的,酷酷的有没有!
在这里插入图片描述
最后感谢大家的观看,我是腕品视界,专注研究腕表定制组装检测,花最少的代价玩最高端的腕表,调测最稳定的机芯性能。

2014-05-27 14:52:26 lyg468088 阅读数 1368

Java文件

package com.example.clock;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
}
}


XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
   android:orientation="vertical"
   android:background="#99ccff"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    tools:context="com.example.clock.MainActivity$PlaceholderFragment" >
    <AnalogClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       />
  <DigitalClock 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
android:textSize="14px"
android:textColor="#f0f"
android:drawableRight="@drawable/ic_launcher"
        />
    <AnalogClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       android:dial="@drawable/watch"
       android:hand_minute="@drawable/hand"
       />
</LinearLayout>





劳力士 ROLEX

阅读数 1022

给老婆买的劳力士

阅读数 915

博文 来自: aprin
没有更多推荐了,返回首页