Android仿华为天气绘制刻度盘

Android 自定义控件 仿支付宝芝麻信用的刻度盘 一、前言 最近在看芝麻信用的时候突发奇想自己做一个芝麻信用的界面然后可以用来装装逼,可惜的是把支付宝解开来没发现相关的界面图片,虽然是这样但也不影响到咱的动手能力,好了,进入正题。 一、分析 来看看芝麻信用的界面先。 可以看到有一个外面有个圆弧,前面一段是渐变的,后面一段颜色浅一些没有渐变的,没有渐变的在渐变的底下,圆弧上还有个小圆点,我们放大圆点这里再看, 其实这个圆点 阅读详情

效果图

Android仿华为天气绘制刻度盘
可以看到这个自定义控件结合了颜色渐变、动态绘制刻度、动态水球效果。接下来我们就来看看这个效果是如何一步一步实现的。

开始自定义控件

和很多自定义控件方式一样需要去基础某种View或者某种ViewGroup
我这里选择的是View,如下所示:

public class HuaWeiView extends View {

    /**
     * 用来初始化画笔等
     * @param context
     * @param attrs
     */
    public HuaWeiView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 用来测量限制view为正方形
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     * 实现各种绘制功能
     * @param canvas
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }
}

其中构造方法用来布局中使用。
onMeasure()方法用来测量和限定view大小
onDraw()方法用来进行具体的绘制功能
如想详细了解请点击:
构造方法
onMeasure()
MeasureSpec
onDraw()
了解以上方法功能后,我们在来看看如何具体使用吧

1使用onMeasure()方法将View限制为一个正方形

只有确定了一个矩形才能够去画椭圆,如果这个矩形是正方形,椭圆也就随之变成了圆形。

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width=MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        //以最小值为正方形的长
        len=Math.min(width,height);
        //设置测量高度和宽度(必须要调用,不然无效果)
        setMeasuredDimension(len,len);
    }

分别通过MeasureSpec取得用户设置的宽和高,然后取出最小值,设置给我们的view,这样我们就做好了一个矩形
现在使用在布局中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/colorPrimary"
    android:padding="20dp"
    tools:context="com.example.huaweiview.MainActivity">

    <com.example.huaweiview.HuaWeiView
        android:layout_gravity="center"
        android:background="@color/colorAccent"
        android:layout_width="200dp"
        android:layout_height="300dp"
        />

</LinearLayout>

效果图
父布局背景为蓝色背景,控件背景为粉色背景,而且设置的宽高不同,但是控件的显示效果还是一个正方形,而且以小值为准。我们的onMeasure()生效了
接下来就是如何在确定一个圆形区域了

2onDraw()绘制圆形区域

绘制之前我们需要对Android中的坐标系有个了解
屏幕中的坐标轴
我们都知道手机屏幕左上角为坐标原点,往右为X正轴,往下为Y正轴。其实手机页面就是activity的展示界面,也是一个View。那可不可以说所有的View在绘制图形的时候都有自己的这么一个坐标系呢(个人想法。。。)
也就是所每个View都有自己的一个坐标系,比如现在的自定义View:
这里写图片描述
现在我们需要在我们自定义的view中绘制一个圆弧,那么这个圆弧的半径就是我们自定义view的长度的一半,即:
radius=len/2;
那么圆心的坐标刚好是(radius,radius)

接下来开始绘制
 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //画圆弧的方法
        canvas.drawArc(oval, startAngle, sweepAngle, useCenter,paint);
    }

介绍一下绘制圆弧的方法:

  • 参数一oval是一个RectF对象为一个矩形
  • 参数二startAngle为圆弧的起始角度
  • 参数三sweepAngle为圆弧的经过角度(扫过角度)
  • 参数四useCenter为圆弧是一个boolean值,为true时画的是圆弧,为false时画的是割弧
  • 参数五paint为一个画笔对象
    也就是说只要确定了一个矩形,在确定他起始和经过的角度就能够画出一个圆弧(这点大家可以用画板测试)

接下来就是初始化这些参数

初始化矩形

 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        //以最小值为正方形的长
        len = Math.min(width, height);
        //实例化矩形
        oval=new RectF(0,0,len,len);
        //设置测量高度和宽度(必须要调用,不然无效果)
        setMeasuredDimension(len, len);
    }

画矩形需要确定左上角和右下角的坐标(通过画板可以测试),通过上面的分析坐标原点就是我们view的左上角,右下角的坐标当然就是len了。

接下来就是初始化起始和经过角度

private float startAngle=120;
private float sweepAngle=300;

需要搞清楚往下为Y轴正轴,刚好和上学时候学的相反,也就是说90度在下方,-90度在上方

初始化画笔

 public HuaWeiView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        paint =new Paint();
        //设置画笔颜色
        paint.setColor(Color.WHITE);
        //设置画笔抗锯齿
        paint.setAntiAlias(true);
        //让画出的图形是空心的(不填充)
        paint.setStyle(Paint.Style.STROKE);
    }
useCenter=false

这里写图片描述

到这里真不容易呀,然而发现只画个圆弧没用呀,我要的是刻度线呀,canvas里面又没用给我们提供画刻度线的方法,这个时候就需要我们自己去写一个画刻度线的方法了。
通过观察图片我们可以看出,所有的线都是从圆弧上的点为起点向某个方向画一条直线,那么该如何确定这两个点呢,需要我们做两件事:

移动坐标系

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //画圆弧的方法
        canvas.drawArc(oval, startAngle, sweepAngle, useCenter,paint);
        //画刻度线的方法
        drawViewLine(canvas);
    }

    private void drawViewLine(Canvas canvas) {
        //先保存之前canvas的内容
        canvas.save();
        //移动canvas(X轴移动距离,Y轴移动距离)
        canvas.translate(radius,radius);
        //操作完成后恢复状态
        canvas.restore();
    }

我们自己写了一个绘制刻度线的方法并在onDraw()方法中调用。移动坐标系之前需要保存之前的canvas状态,然后X和Y轴分别移动圆弧半径的距离,如下图:
这里写图片描述

canvas.translate(radius,radius);方法移动的是坐标系(通过实际效果和查资料所得)
canvas.save()和canvas.restore()要成对出现,就好像流用完要关闭一样。

第一件事情完成后,开始第二件事情,旋转坐标系

只通过移动坐标系,仍然很难确定圆弧点上的坐标,和另外一点的坐标,
如果这两个点都在坐标轴上该多好呀,下面实现:

 private void drawViewLine(Canvas canvas) {
        //先保存之前canvas的内容
        canvas.save();
        //移动canvas(X轴移动距离,Y轴移动距离)
        canvas.translate(radius,radius);
        //旋转坐标系
        canvas.rotate(30);
        //操作完成后恢复状态
        canvas.restore();
    }

画刻度线的方法了增加了一个旋转30度的代码,旋转后的坐标系应该怎么样呢;
这里写图片描述
因为起始点和90度相差30,旋转之后,起始点刚好落在了Y轴上,那么这个点的坐标就很好确定了吧,没错就是(0,radius);如果我们在Y轴上在找一点不就可以画出一条刻度线了吗,那么它的坐标是多少呢?对,应该是(0,radius-y),因为我们要往内部化刻度线,因此是减去一个值,赶快去试试吧,代码如下:

 private void drawViewLine(Canvas canvas) {
        //先保存之前canvas的内容
        canvas.save();
        //移动canvas(X轴移动距离,Y轴移动距离)
        canvas.translate(radius,radius);
        //旋转坐标系
        canvas.rotate(30);
        Paint linePatin=new Paint();
        //设置画笔颜色
        linePatin.setColor(Color.WHITE);
        //线宽
        linePatin.setStrokeWidth(2);
        //设置画笔抗锯齿
        linePatin.setAntiAlias(true);
        //画一条刻度线
        canvas.drawLine(0,radius,0,radius-40,linePatin);
        //操作完成后恢复状态
        canvas.restore();
    }

根据得到的两个点的坐标,画出来一条白线,如图:
这里写图片描述

当然这些点都是移动后的坐标系在旋转30度得到的,这里画好了一条线,如果画多条呢,还是刚才的思路每次都让它旋转一个小角度然后画条直线不就好了吗,那么旋转多少度呢,比如这里:总共扫过的角度sweepAngle=300;需要100条刻度,那么每次需要旋转的角度rotateAngle=sweepAngle/100,具体代码如下:

 private void drawViewLine(Canvas canvas) {
        //先保存之前canvas的内容
        canvas.save();
        //移动canvas(X轴移动距离,Y轴移动距离)
        canvas.translate(radius,radius);
        //旋转坐标系
        canvas.rotate(30);
        Paint linePatin=new Paint();
        //设置画笔颜色
        linePatin.setColor(Color.WHITE);
        //线宽
        linePatin.setStrokeWidth(2);
        //设置画笔抗锯齿
        linePatin.setAntiAlias(true);
        //确定每次旋转的角度
        float rotateAngle=sweepAngle/99;
        for(int i=0;i<100;i++){
            //画一条刻度线
            canvas.drawLine(0,radius,0,radius-40,linePatin);
            canvas.rotate(rotateAngle);
        }

        //操作完成后恢复状态
        canvas.restore();
    }

100个刻度,需要101次循环画线(请看你的手表),画完线就旋转。依次循环,如图
这里写图片描述

经过这么久的时间总于完成了刻度盘了,接下来就是去确定不同角度显示什么样的颜色,首选我们需要确定要绘制的范围targetAngle:

绘制有色部分

private void drawViewLine(Canvas canvas) {
        //先保存之前canvas的内容
        canvas.save();
        //移动canvas(X轴移动距离,Y轴移动距离)
        canvas.translate(radius,radius);
        //旋转坐标系
        canvas.rotate(30);
        Paint linePatin=new Paint();
        //设置画笔颜色
        linePatin.setColor(Color.WHITE);
        //线宽
        linePatin.setStrokeWidth(2);
        //设置画笔抗锯齿
        linePatin.setAntiAlias(true);
        //确定每次旋转的角度
        float rotateAngle=sweepAngle/100;
        //绘制有色部分的画笔
        Paint targetLinePatin=new Paint();
        targetLinePatin.setColor(Color.GREEN);
        targetLinePatin.setStrokeWidth(2);
        targetLinePatin.setAntiAlias(true);
        //记录已经绘制过的有色部分范围
        float hasDraw=0;
        for(int i=0;i<=100;i++){
            if(hasDraw<=targetAngle&&targetAngle!=0){//需要绘制有色部分的时候
                //画一条刻度线
                canvas.drawLine(0,radius,0,radius-40,targetLinePatin);
            }else {//不需要绘制有色部分
                //画一条刻度线
                canvas.drawLine(0,radius,0,radius-40,linePatin);
            }
            //累计绘制过的部分
            hasDraw+=rotateAngle;
            //旋转
            canvas.rotate(rotateAngle);
        }

        //操作完成后恢复状态
        canvas.restore();
    }

我们需要不断的去记录绘制过的有效部分,之外的部分画白色。
这里写图片描述

根据角度的比例,颜色渐变

需要计算出已经绘制过的角度占总角度(300)的比例

for(int i=0;i<=100;i++){
            if(hasDraw<=targetAngle&&targetAngle!=0){//需要绘制有色部分的时候
                //计算已经绘制的比例
                float percent=hasDraw/sweepAngle;
                int red= 255-(int) (255*percent);
                int green= (int) (255*percent);
                targetLinePatin.setARGB(255,red,green,0);
                //画一条刻度线
                canvas.drawLine(0,radius,0,radius-40,targetLinePatin);
            }else {//不需要绘制有色部分
                //画一条刻度线
                canvas.drawLine(0,radius,0,radius-40,linePatin);
            }
            hasDraw+=rotateAngle;
            canvas.rotate(rotateAngle);
        }

只是在绘制有色部分的时候,利用三元素来实现渐变。所占比例越低红色值越大,反正绿色值越大。
Android仿华为天气绘制刻度盘

实现动态显示

先想一下它的运动情况,分为前进状态和后退状态,如果正在运动(一次完整的后退和前进没用结束),就不能开始下次运动,需要两个参数,state和isRunning

//判断是否在动
    private boolean isRunning;
    //判断是回退的状态还是前进状态
    private int state = 1;
    public void changeAngle(final float trueAngle) {
        if (isRunning){//如果在动直接返回
            return;
        }
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                switch (state) {
                    case 1://后退状态
                    isRunning=true;
                        targetAngle -= 3;
                        if (targetAngle <= 0) {//如果回退到0
                            targetAngle = 0;
                            //改为前进状态
                            state = 2;
                        }
                        break;
                    case 2://前进状态
                        targetAngle += 3;
                        if (targetAngle >= trueAngle) {//如果增加到指定角度
                            targetAngle = trueAngle;
                            //改为后退状态
                            state = 1;
                            isRunning=false;
                            //结束本次运动
                            timer.cancel();
                        }
                        break;
                    default:
                        break;
                }
                //重新绘制(子线程中使用的方法)
                postInvalidate();
            }
        }, 500, 30);
    }

利用时间任务,每个30毫秒去执行一次run方法,每次都重新绘制图片,然后在activity中调用此方法

 HuaWeiView hwv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        hwv= (HuaWeiView) findViewById(R.id.hwv);
        hwv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击事件中,调用动的方法
                hwv.changeAngle(200);
            }
        });

    }

这里写图片描述

看到这里了,相信你对坐标系和角度动态变化,以及刻度盘的绘制有了个很好的认识,多多验证会有助于理解。

接下来要实现背景动态渐变

想想咱们的view中哪里用了渐变呢?对,在绘制有色部分的时候,如果我们能将颜色渐变的值不断的传到activity中该多好呀,下面就要用接口传值实现这一功能了:

  • 首选在自定义View中声明一个内部接口:
  private OnAngleColorListener onAngleColorListener;

    public void setOnAngleColorListener(OnAngleColorListener onAngleColorListener) {
        this.onAngleColorListener = onAngleColorListener;
    }


    public interface OnAngleColorListener{
       void colorListener(int red,int green);
    }

我们在自定义View中声明一个内部接口,并声明一个全局接口对象,提供一个set方法
接口内有个方法用来获取颜色值
接下来就是在合适的地方调用这个方法,那么哪里呢,就是我们绘制颜色刻度时调用:

for (int i = 0; i <= 100; i++) {
            if (hasDraw <= targetAngle && targetAngle != 0) {//需要绘制有色部分的时候
                //计算已经绘制的比例
                float percent = hasDraw / sweepAngle;
                int red = 255 - (int) (255 * percent);
                int green = (int) (255 * percent);
                //实现接口回调,传递颜色值
                if (onAngleColorListener!=null){
                    onAngleColorListener.colorListener(red,green);
                }
                targetLinePatin.setARGB(255, red, green, 0);
                //画一条刻度线
                canvas.drawLine(0, radius, 0, radius - 40, targetLinePatin);
            } else {//不需要绘制有色部分
                //画一条刻度线
                canvas.drawLine(0, radius, 0, radius - 40, linePatin);
            }

我们在绘制的时候实现了接口回调,接下来去activity中实现接口

public class MainActivity extends AppCompatActivity {

    HuaWeiView hwv;
    LinearLayout ll_parent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        hwv= (HuaWeiView) findViewById(R.id.hwv);
        //实例父布局
        ll_parent= (LinearLayout) findViewById(R.id.ll_parent);
        hwv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击事件中,调用动的方法
                hwv.changeAngle(200);
            }
        });
        //设置角度颜色变化监听
        hwv.setOnAngleColorListener(new HuaWeiView.OnAngleColorListener() {
            @Override
            public void colorListener(int red, int green) {
                Color color=new Color();
                //通过Color对象将RGB值转为int类型
                int backColor=color.argb(100,red,green,0);
                //父布局设置背景
                ll_parent.setBackgroundColor(backColor);
            }
        });

    }
}

给父布局一个id,然后实例化。给我们的自定义控件设置一个角度颜色变化监听,从而拿到回调中传过来的值,然后借助Color对象将RGB值转为int值,再设置给父布局背景,这里背景稍稍透明一些。效果图:
这里写图片描述

到了这里是不是感觉炫酷了不少呢,其实功能已经实现的差不多了,接下来就是去绘制里面的内容吧

绘制文字

当然不去绘制文字也是可以的,你可以直接在布局中添加textview等。好话不多说,先分析一下绘制的过程吧,在刻度盘的内部有一个小圆,然后这些文字就在小圆内,绘制小圆只需要让它的半径小点就OK了。

/**
     * 绘制小圆和文本的方法,小圆颜色同样渐变
     * @param canvas
     */
    private void drawScoreText(Canvas canvas) {
        //先绘制一个小圆
        Paint smallPaint = new Paint();
        smallPaint.setARGB(100,red,green,0);
        // 画小圆指定圆心坐标,半径,画笔即可
        int smallRadius=radius-60;
        canvas.drawCircle(radius, radius, radius - 60, smallPaint);
        //绘制文本
        Paint textPaint=new Paint();
        //设置文本居中对齐
        textPaint.setTextAlign(Paint.Align.CENTER);
        textPaint.setColor(Color.WHITE);
        textPaint.setTextSize(smallRadius/2);
        //score需要通过计算得到
        canvas.drawText(""+score,radius,radius,textPaint);
        //绘制分,在分数的右上方
        textPaint.setTextSize(smallRadius/6);
        canvas.drawText("分",radius+smallRadius/2,radius-smallRadius/4,textPaint);
        //绘制点击优化在分数的下方
        textPaint.setTextSize(smallRadius/6);
        canvas.drawText("点击优化",radius,radius+smallRadius/2,textPaint);

    }

这里将之前渐变的red和green提为全局变量,先绘制一个小圆,画笔颜色渐变。然后绘制文字分数score需要通过计算的到

//计算得到的分数
score=(int)(targetAngle/sweepAngle*100);
//重新绘制(子线程中使用的方法)
postInvalidate();

在时间任务中,每次绘制之前计算得到分数,然后在右上方画一个固定值分,再在下方一个固定内容点击优化(这个时候的坐标已经回到最初的模样)
这里写图片描述

到此为止功能已经写的差不多了,还有一个水波加速球效果,下篇博客中写吧。
最后对于原理底层方面,我也有待学习,有错的地方欢迎指正,谢谢。项目已经上传到github
github点击下载

最后的最后,个人淘宝店(抱歉,请见谅)。。霓裳雅阁

Android实现仪表刻度盘 使用Canvas绘制仪表刻度盘,通过填充数据实现动态的仪表盘数据。 立即下载

相关推荐

MATLAB新手也能懂:用MATPOWER 8.0b搞定电力系统潮流计算(附case9实战代码)

本文详细介绍了如何使用MATPOWER 8.0b在MATLAB中进行电力系统潮流计算,特别适合新手入门。通过case9实战案例,讲解了从安装配置到运行牛顿-拉夫逊法潮流计算的全过程,包括结果分析和常见问题处理,帮助读者快速掌握这一电力系统分析的核心技能。

weixin_26757925的博客 380

Android 自定义view画带指针带动画的上半圆弧刻度盘

之前工作中有用到环形进度条等的,为了赶进度都是在网上找到相似的效果的然后再进行修改。一直都想自己画一个,今天就和大家一起来学习刻度盘的绘制。 先看一下截图: 效果演示请看刻度盘演示 代码下载:CalibrationView.zip 在文章后面也会贴出全部代码 实现思路主要有: 1.确定中心点坐标 2.画出背景圆弧以及刻度点 3.画出实际进度值及刻度点 4.画指针 5.增......

肖波的博客 4765

IEEE PHM 2012轴承数据实战:用LSTM预测剩余寿命的完整流程与调参心得

本文详细解析了如何利用IEEE PHM 2012轴承数据集和LSTM模型进行轴承剩余寿命预测。从数据预处理、特征工程到LSTM模型架构设计和调参技巧,提供了完整的实战流程。特别分享了FEMTO-ST数据集的处理方法、RUL标签构建策略以及提升预测精度的关键技巧,帮助工程师实现更准确的预测性维护。

weixin_31100517的博客 368

android自定义刻度盘 表盘 速度表

android自定义刻度盘 表盘 速度表效果图 直接在xml文件中添加即可,在代码中调用setProgress(int) 即可。代码注释写的很清楚,有兴趣的随便改改。InstrumentView.javapackage com.xk.testdemo.view;import android.content.Context; import android.graphics.Canvas; i

薛凯的博客 6015

【无标题】 Python自动化法律文书撰写

Jinja2是一个功能强大的模板引擎,支持丰富的语法和功能。除了条件判断和循环语句外,Jinja2还支持过滤器、宏、继承等高级特性,非常适合处理复杂的文书模板。

master_chenchen的博客 2063

SAP GUI 字段遮罩功能详解及实现

默认情况下,系统使用作为掩码模式,遮罩整个字段内容长度;对于货币金额类型,掩码后会保留小数位并在整数位部分全部显示为,如****.**若需自定义掩码模式,可利用以下方式:维护“Maintain Masking Pattern”节点,在其中定义新的掩码方式(如:只露出后四位,其他位以X替代等);实现 BAdI(或类似命名,具体以系统版本为准)的方法,通过 ABAP 代码读取原始值,并依据业务逻辑生成掩码字符串返回,动态替换界面输出值;

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 709

android 网速刻度盘 自定义view一

第一次写博客,有点小激动,哈哈。这个是网速显示刻度盘的一个功能,我找了很多资料都没有合适的,就只有自己写了, 找的资料基本都是只有半个圈的刻度盘,并且刻度颜色变化也很少,都是圆弧在变色,所以自己动手写了一个 刻度可以边颜色 刻度盘也不止半圈。如图在输入框里面输入整数,支持0-20480kb/s 也就是20M 部分截图 @Override protected void onDraw(Ca

u012840567的专栏 1218

SAP-MM-采购过账接口(与WMS集成)-代码

1、判断传入值非空检验; 2、判断过账日期是否允许在当前期间; 3、判断是否为集采订单业务,是否审批完成; 4、判断是否发布标准成本发布(此业务场景与价格控制3+S有关) 5、保存日志表; 6、判断业务公司订单审批状态; 7、创建STO交货单、集采公司订单过账、STO公司间创建交货单、交货单过账(两步法)、过账失败回滚(冲销交货、删除交货单、冲销集采入库)

qq_32198063的博客 421

android 刻度,Android 绘制刻度表盘

效果图和代码WeChat_20210311180033.gifpublic class NetSpeedDialPlateView extends View {private int preWidth;private int preHeight;private Paint paintTranArc;private Paint paint1;//最外层单线画笔private Paint paintO...

weixin_28884611的博客 689

MTK Camera HAL 与 FeaturePipe 架构解析:从硬件抽象到功能管线的工程落地路径

MTK 的 Camera 系统在 Android 平台下采用高度模块化的 HAL 与 FeaturePipe 架构组合,分别承担着底层硬件抽象与上层功能封装的职责。通过将 ISP、3A 算法、Sensor 驱动与图像处理节点解耦封装于功能链条中,联发科平台实现了灵活可控的影像能力调度机制。本文将基于真实项目实践,系统解析 MTK Camera HAL 与 FeaturePipe 架构的设计思路、核心模块与运行机制,结合 AE/AWB/AF 控制流、Buffer 管理策略、功能管线构建方法与多线程调度实现方式

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1572

2025爬虫实战:某音直播间实时弹幕获取原理及源码分析

某音直播弹幕虽然没有直接挂在 DOM 上,但由于用的是西瓜播放器,弹幕是通过 JS 接口动态渲染的,这就给了我们 Hook 的机会。关键点是找到调用的位置,然后拦截并输出对象里的message字段。这个思路其实也适用于其他前端渲染的播放器,比如 B 站的 DPlayer、HLS.js、甚至很多自研播放器都有类似结构。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1814

android实现简单天气预报代码,Android应用开发之仿华为天气预报圆形刻度图的代码实现...

本文将带你了解Android应用开发之仿华为天气预报圆形刻度图的代码实现,希望本文对大家学Android有所帮助。仿华为天气预报圆形刻度图的代码实现public class ScaleProgressView extends View {private int len;private final int startAngle = 40;private final int sweepA...

weixin_31451231的博客 345

KEPServerEX 6 之驱动协议(UDD)实战 HTTP协议对接OpenWeatherMap天气 API全流程指南

本文分享了基于 KEPServerEX 6 的通用设备驱动(UDD)对接OpenWeatherMap天气API的实战方案。该方案针对工业物联网场景进行了深度优化,具有动态城市切换、运行时热配置、老旧JS引擎兼容等核心特性。文章详细介绍了从环境准备、脚本部署到Tag配置的全流程,重点解析了Legacy JS语法适配、Float类型安全处理等关键实现细节,并提供了完整的避坑指南和故障排查方法。该方案经过生产环境验证,可稳定实现气象数据采集与动态切换功能,适用于SCADA/MES系统集成场景。

-雲飛兄-博客 714

实现一个仿华为天气的进度圆

第一次自己动手写东西,觉得写一遍能加深自己的理解,记忆,这个控件是基于别人的基础上改动的 ,原文连接 在这里! 第一次弄,不会效果图,大概就是一个刻度盘 先说思路:每一个刻度是一条线条,根据圆心和半径来确定每条线的x,y终点坐标,以及根据圆心和(半径-短线长度)来确定每条线的x,y起点坐标,然后起点到终点画线就可以了。按圆弧的坐标画一百条线条表示刻度盘地盘 再换一个颜色的画笔画上进度

Void_J的博客 1273

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

仿华为天气刻度圆盘

声明:本文参考[http://m.blog.youkuaiyun.com/article/details?id=51111125](http://m.blog.youkuaiyun.com/article/details?id=51111125)的绘制,但是加入了更多的逻辑判断, 这里感谢作者。下面看最终效果....

1656

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

thumb 垂直seekbar 居中_Android自定义可控制精度带刻度盘和波纹效果的炫酷SeekBar...

一、前言最近项目里面需要用到多个seekbar并且需要显示不同的精度,于是参考了部分博客模仿华为的天气刻度盘添加了精度控制和自己定义的seekbar实现了如下效果(画面模糊是因为录制Gif图的工具导致的)。本控件最低兼容到API16 更低的版本没有getThumb()函数二、刻度盘部分1.刻度:刻度的绘制类似于绘制时钟刻度绘制出一条刻度通过旋转canvas绘制出其他刻度2.波浪:波浪的绘制是通过两...

weixin_42515302的博客 797

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android-顺时逆时旋转的仪表盘控件

在一次项目需求中,第一次解除

3359

温度曲线图android源码,android 自定义控件-体温走势图(温度计+曲线+列表).doc

android 自定义控件-体温走势图(温度计+曲线+列表).doc还剩34页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,很抱歉,此页已超出免费预览范围啦!如果喜欢就下载吧,价低环保!内容要点:@SuppressLint("SimpleDateFormat")public String getViatlTimeForHm(){if(this.date==null)return null;S...

weixin_39843677的博客 506

Android表盘自定义控件

Header         很久不写自定义控件,最近一个项目中有个控件需要进行自定义,便拿着这个控件重新熟悉了一下自定义控件的流程和思维方式,自定义控件在Android中算是一个基础技能,熟悉自定义控件,可以在原生控件无法满足需求的情况下游刃有余,下面来看看这个简单的自定义控件是如何实现的。 Body         效果         首先,要做的是一个半圆环控件,类似汽车速度仪表盘...

lianwa88的博客 4902

Android安卓自定义温度计/垂直进度条

安卓自定义温度计/垂直进度条 目标是在布局中添加一个可以显示数值的温度计。安卓提供的进度条样式有限,宽度不能调节。在网上搜到了几种方法都不理想,最后发现用两个重叠的图片就可以做到,不需要添加代码或自定义控件。 在布局文件中添加如下代码: <RelativeLayout android:layout_width="40dp" ...

weixin_44226356的博客 1420

Android自定义View实战---圆盘温度计,2024年最新Android高级工程师进阶学习】

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2401_84166147的博客 976
上一篇: Android开发实现TextView跑马灯效果
下一篇: android自定义组件(手机加速球+水面波动效果)
彼天
博客等级 码龄11年 37粉丝 85原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值