广告
返回顶部
首页 > 资讯 > 精选 >Android如何自定义view实现日历打卡签到
  • 490
分享到

Android如何自定义view实现日历打卡签到

2023-06-14 23:06:57 490人浏览 安东尼
摘要

这篇文章主要介绍Android如何自定义view实现日历打卡签到,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android是什么Android是一种基于linux内核的自由及开放源代码的操作系统,主要使用于移动设备

这篇文章主要介绍Android如何自定义view实现日历打卡签到,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Android是什么

Android是一种基于linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发

1.说明

自己写一个view实现每天签到的功能,设置背景图片

源码下载

2.效果图

Android如何自定义view实现日历打卡签到

3.主界面

package com.example.myapplication30; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;import java.util.ArrayList;import java.util.Calendar;import java.util.List; public class MainActivity extends AppCompatActivity {    //参考网址:https://blog.csdn.net/Macaopark/article/details/102069775    private TextView mTvDaySum;    private TextView mTvMonth;    private SignView mCvCalendar;    private List<SignEntity> data;    private Calendar calendar;     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTvDaySum = findViewById(R.id.punch_tv_day_sum);        mTvMonth = findViewById(R.id.punch_tv_month);        mCvCalendar = findViewById(R.id.punch_cv_calendar);    }     @Override    protected void onStart() {        super.onStart();        onReady();    }     @SuppressLint("SetTextI18n")    private void onReady() {          calendar = Calendar.getInstance();        int year = calendar.get(Calendar.YEAR);        int month = calendar.get(Calendar.MONTH);        //int date =  calendar.get(Calendar.DATE);        int dayOfMonthToday = calendar.get(Calendar.DAY_OF_MONTH);        List<SignDate> signDates = new ArrayList<>();        signDates.add(new SignDate(2021, 5, 1, true));        signDates.add(new SignDate(2021, 5, 2, true));        signDates.add(new SignDate(2021, 5, 3, true));        signDates.add(new SignDate(2021, 5, 4, true));        signDates.add(new SignDate(2021, 5, 5, true));         mTvDaySum.setText("本期连续登录\t"+signDates.size()+"\t天");        mTvMonth.setText(year+"年"+getResources().getStringArray(R.array.month_array)[month]+"\t"+dayOfMonthToday+"日");         data = new ArrayList<>();        for (int i = 1; i <= dayOfMonthToday; i++) {            SignEntity signEntity = new SignEntity();            if (i == dayOfMonthToday) {                signEntity.setDayType(2);            } else {                signEntity.setDayType(1);            }            for (int j = 0; j < signDates.size(); j++) {                if (signDates.get(j).getDay() == i) {                    signEntity.setDayType(0);                    break;                } else if (dayOfMonthToday == i) {                    signEntity.setDayType(2);                } else {                    signEntity.setDayType(1);                }            }            data.add(signEntity);        }         SignAdapter signAdapter = new SignAdapter(data);        mCvCalendar.setAdapter(signAdapter);    } }

4.适配器

package com.example.myapplication30;  import java.util.List; public class SignAdapter extends CalendarAdapter {    private List<SignEntity> data;     public SignAdapter(List<SignEntity> data) {        this.data = data;    }     @Override    public SignView.DayType getType(int dayOfMonth) {        return SignView.DayType.valueOf(data.get(dayOfMonth - 1).getDayType());    }}

5.自定义view

package com.example.myapplication30;  import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapShader;import android.graphics.canvas;import android.graphics.Color;import android.graphics.ComposeShader;import android.graphics.LinearGradient;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PorterDuff;import android.graphics.RadialGradient;import android.graphics.Rect;import android.graphics.Shader;import android.graphics.SweepGradient;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;  import java.util.Calendar; public class SignView extends View {    private static final String[] WEEK_MARK = {"一", "二", "三", "四", "五", "六", "日"};     private static final int MAX_COLUMN = 7;        private static final int COLOR_MARKER_WEEKDAY = 0xFF999999;    private static final int COLOR_MARKER_WEEKEND = 0xFF1B89CD;        //private static final int COLOR_BACKGROUND_HIGHLIGHT = 0xFFFF0000;        private static final int COLOR_BACKGROUND_NORMAL = 0xFF9C9C9C;        private static final int COLOR_BACKGROUND_WAIT = 0xFFFE7471;        private static final int COLOR_TEXT_HIGHLIGHT = 0xFFFFFFFF;        private static final int COLOR_TEXT_NORMAL = 0xFF606060;//    /     * 不可用文字颜色//     *///    private static final int COLOR_TEXT_DISABLED = 0xFFD4D4D4;     private static final int MARKER_TEXT_SIZE = 40;    private static final int CELL_TEXT_SIZE = 40;     private static final int VERTICAL_SPACE = 51;    private static final int VERTICAL_MARGIN = 62;    private static final int HORIZONTAL_MARGIN = 39;    private static final int CELL_SIZE = 80;    private static final int WAIT_LINE_SIZE = 14;     private int dayOfMonthToday;    private int markerTextY;    private int verticalCellTop;    private int sumDayOfMonth;    private int daysOfFirstWeek;    private int horizontalSpace;    private int deltaTextCellY;    private int deltaTextMarkerY;     private int verticalSpace;    private int verticalMargin;    private int horizontalMargin;    private int cellSize;    private int waitLineSize;     private Path waitPath;    private Rect waitRect;    private Paint paintWeekday;    private Paint paintWeekend;    private Paint paintTextNormal;    private Paint paintTextHighlight;    private Paint paintBackgroundWait;    private Paint paintBackgroundNormal;    private Paint paintBackgroundHighlight;    private CalendarAdapter adapter;     public SignView(Context context) {        this(context, null);    }     public SignView(Context context, AttributeSet attrs) {        this(context, attrs, -1);    }     public SignView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initResolution();        initPaint();        initData();    }     private void initResolution() {//        resolutionUtil = ResolutionUtil.getInstance();//        verticalSpace = resolutionUtil.formatVertical(VERTICAL_SPACE);//        verticalMargin = resolutionUtil.formatVertical(VERTICAL_MARGIN);//        horizontalMargin = resolutionUtil.formatHorizontal(HORIZONTAL_MARGIN);//        cellSize = resolutionUtil.formatVertical(CELL_SIZE);//        waitLineSize = resolutionUtil.formatVertical(WAIT_LINE_SIZE);        verticalSpace = VERTICAL_SPACE;        verticalMargin = VERTICAL_MARGIN;        horizontalMargin = HORIZONTAL_MARGIN;        cellSize = CELL_SIZE;        waitLineSize = WAIT_LINE_SIZE;     }     private void initPaint() {//        int markerTextSize = resolutionUtil.formatVertical(MARKER_TEXT_SIZE);//        int cellTextSize = resolutionUtil.formatVertical(CELL_TEXT_SIZE);        int markerTextSize = MARKER_TEXT_SIZE;        int cellTextSize = CELL_TEXT_SIZE;         paintWeekday = new Paint();        paintWeekday.setAntiAlias(true);        paintWeekday.setColor(COLOR_MARKER_WEEKDAY);        paintWeekday.setTextSize(markerTextSize);        paintWeekday.setTextAlign(Paint.Align.CENTER);         paintWeekend = new Paint();        paintWeekend.setAntiAlias(true);        paintWeekend.setColor(COLOR_MARKER_WEEKEND);        paintWeekend.setTextSize(markerTextSize);        paintWeekend.setTextAlign(Paint.Align.CENTER);         paintTextNormal = new Paint();        paintTextNormal.setAntiAlias(true);        paintTextNormal.setColor(COLOR_TEXT_NORMAL);        paintTextNormal.setTextSize(cellTextSize);        paintTextNormal.setTextAlign(Paint.Align.CENTER);         paintTextHighlight = new Paint();        paintTextHighlight.setAntiAlias(true);        paintTextHighlight.setColor(COLOR_TEXT_HIGHLIGHT);        paintTextHighlight.setTextSize(cellTextSize);        paintTextHighlight.setTextAlign(Paint.Align.CENTER);         paintBackgroundWait = new Paint();        paintBackgroundWait.setAntiAlias(true);        paintBackgroundWait.setColor(COLOR_BACKGROUND_WAIT);        paintBackgroundWait.setStrokeWidth(2);        paintBackgroundWait.setStyle(Paint.Style.STROKE);         paintBackgroundNormal = new Paint();        paintBackgroundNormal.setAntiAlias(true);        paintBackgroundNormal.setColor(COLOR_BACKGROUND_NORMAL);        paintBackgroundNormal.setStrokeWidth(2);        paintBackgroundNormal.setStyle(Paint.Style.STROKE);         paintBackgroundHighlight = new Paint();        paintBackgroundHighlight.setAntiAlias(true);        paintBackgroundHighlight.setStrokeWidth(2);        paintBackgroundHighlight.setStyle(Paint.Style.FILL);        //颜色        //paintBackgroundHighlight.setColor(COLOR_BACKGROUND_HIGHLIGHT);        //多种颜色数组        //int[] colors = {Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW,Color.MAGENTA};        //float[] position = {0f, 0.2f, 0.4f, 0.6f, 1.0f};        //Shader shader1 = new LinearGradient(100,850,600,850,colors,position,Shader.TileMode.CLAMP);        //paintBackgroundHighlight.setShader(shader1);        //设置背景图片             }     private void initData() {        Paint.FontMetricsInt fmiMarker = paintWeekday.getFontMetricsInt();        deltaTextMarkerY = -(fmiMarker.bottom - fmiMarker.top) / 2 - fmiMarker.top;        markerTextY = verticalMargin + cellSize / 2;         Paint.FontMetricsInt fmiCell = paintTextNormal.getFontMetricsInt();        deltaTextCellY = -(fmiCell.bottom - fmiCell.top) / 2 - fmiCell.top;        verticalCellTop = verticalMargin + cellSize;         Calendar calendartoday = Calendar.getInstance();        dayOfMonthToday = calendarToday.get(Calendar.DAY_OF_MONTH);        int dayOfWeek;        sumDayOfMonth = calendarToday.getActualMaximum(Calendar.DAY_OF_MONTH);         Calendar calendarFirstDay = Calendar.getInstance();        calendarFirstDay.set(Calendar.DAY_OF_MONTH, 1);        dayOfWeek = calendarFirstDay.get(Calendar.DAY_OF_WEEK);        if (dayOfWeek == Calendar.SUNDAY) {            dayOfWeek = 7;        } else {            dayOfWeek = dayOfWeek - 1;        }        daysOfFirstWeek = MAX_COLUMN - dayOfWeek + 1;    }     private void createWaitBackground(int topX, int topY) {        waitPath = new Path();        waitPath.moveTo(topX, topY + waitLineSize);        waitPath.lineTo(topX, topY);        waitPath.lineTo(topX + waitLineSize, topY);         waitPath.moveTo(topX + cellSize - waitLineSize, topY + cellSize);        waitPath.lineTo(topX + cellSize, topY + cellSize);        waitPath.lineTo(topX + cellSize, topY + cellSize - waitLineSize);         waitRect = new Rect(topX, topY, topX + cellSize, topY + cellSize);    }     @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        horizontalSpace = (w - MAX_COLUMN * cellSize - horizontalMargin * 2) / (MAX_COLUMN - 1);    }     @Override    public void draw(Canvas canvas) {        super.draw(canvas);        drawWeekMark(canvas);        drawCellsBackground(canvas);        drawCells(canvas);    }     private void drawWeekMark(Canvas canvas) {        int y = markerTextY + deltaTextMarkerY;        for (int i = 0; i < 7; i++) {            int x = horizontalMargin + i * (horizontalSpace + cellSize)                    + cellSize / 2;            if (i < 5) {                canvas.drawText(WEEK_MARK[i], x, y, paintWeekday);            } else {                canvas.drawText(WEEK_MARK[i], x, y, paintWeekend);            }        }    }     private void drawCellsBackground(Canvas canvas) {        for (int i = 1; i <= dayOfMonthToday; i++) {            drawCellBackground(canvas, i, getColumnIndex(i), getRowIndex(i));        }    }         private void drawCellBackground(Canvas canvas, int dayOfMonth, int column, int row) {        int x = horizontalMargin + column * (horizontalSpace + cellSize)                + cellSize / 2;        int y = verticalCellTop + verticalSpace * (row + 1) + cellSize * row + cellSize / 2;        if (adapter != null) {            DayType dayType = adapter.getType(dayOfMonth);            switch (dayType) {                case WAITING:                    if (waitPath == null) {                        createWaitBackground(x - cellSize / 2, y - cellSize / 2);                    }                    canvas.drawPath(waitPath, paintBackgroundWait);                    break;                case SIGNED:                 //     canvas.drawCircle(x, y, cellSize/2, paintBackgroundHighlight);                //  canvas.drawRect(x - 60, y - 60, x + 60, y + 60, paintBackgroundHighlight);// 正方形                   // Bitmap placeholder = BitmapFactory.decodeResource(getResources(), R.mipmap.purtest);                 //   canvas.drawBitmap(placeholder,);wCircle(x, y, cellSize/2, paintBackgroundHighlight);                    canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.small3),x-40, y-40 , paintBackgroundHighlight);                    break;                default:                    canvas.drawCircle(x, y, cellSize / 2, paintBackgroundNormal);                    break;            }        } else {            canvas.drawCircle(x, y, cellSize / 2, paintBackgroundNormal);        }    }     private void drawCells(Canvas canvas) {        for (int i = 1; i <= sumDayOfMonth; i++) {            drawCell(canvas, i, getColumnIndex(i), getRowIndex(i));        }    }         private void drawCell(Canvas canvas, int dayOfMonth, int column, int row) {        int x = horizontalMargin + column * (horizontalSpace + cellSize)                + cellSize / 2;        int y = verticalCellTop + verticalSpace * (row + 1) + cellSize * row + cellSize / 2                + deltaTextCellY;        if (adapter != null && dayOfMonth <= dayOfMonthToday) {            DayType dayType = adapter.getType(dayOfMonth);            Paint paint;            switch (dayType) {                case SIGNED:                    paint = paintTextHighlight;                    break;                default:                    paint = paintTextNormal;                    break;            }            canvas.drawText(String.valueOf(dayOfMonth), x, y, paint);        } else {            canvas.drawText(String.valueOf(dayOfMonth), x, y, paintTextNormal);        }    }         private int getColumnIndex(int dayOfMonth) {        Calendar calendar = Calendar.getInstance();        calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);        if (dayOfWeek == Calendar.SUNDAY) {            dayOfWeek = 6;        } else {            dayOfWeek = dayOfWeek - 2;        }        return dayOfWeek;    }         private int getRowIndex(int dayOfMonth) {        float weight = (dayOfMonth - daysOfFirstWeek) / (MAX_COLUMN * 1f);        double rowIndexDouble = Math.abs(Math.ceil(weight));        return (int) rowIndexDouble;    }     @Override    public boolean onTouchEvent(MotionEvent event) {        if (event.getAction() == MotionEvent.ACTION_UP) {            float x = event.getX();            float y = event.getY();            if (waitPath != null) {                if (adapter.getType(dayOfMonthToday).equals(DayType.WAITING)) {                    if (x >= waitRect.left && y >= waitRect.top && x <= waitRect.right && y <= waitRect.bottom) {                        if (onTodayClickListener != null) {                            onTodayClickListener.onTodayClick();                        }                    }                }            }        }        return true;    }     public void setAdapter(CalendarAdapter adapter) {        this.adapter = adapter;        this.invalidate();    }     public int getDayOfMonthToday() {        return dayOfMonthToday;    }     public void notifyDataSetChanged() {        invalidate();    }     private OnTodayClickListener onTodayClickListener;     public void setOnTodayClickListener(OnTodayClickListener onTodayClickListener) {        this.onTodayClickListener = onTodayClickListener;    }     public interface OnTodayClickListener {        void onTodayClick();    }     public enum DayType {                SIGNED(0),                UNSIGNED(1),                WAITING(2),                UNREACHABLE(3),                DISABLED(4);         private int value;         DayType(int value) {            this.value = value;        }         public int getValue() {            return value;        }         public static DayType valueOf(int value) {            switch (value) {                case 0:                    return SIGNED;                case 1:                    return UNSIGNED;                case 2:                    return WAITING;                case 3:                    return UNREACHABLE;                case 4:                    return DISABLED;                default:                    return DISABLED;            }        }    }}

以上是“Android如何自定义view实现日历打卡签到”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Android如何自定义view实现日历打卡签到

本文链接: https://www.lsjlt.com/news/276071.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android自定义view实现日历打卡签到
    本文实例为大家分享了Android自定义view实现日历打卡签到的具体代码,供大家参考,具体内容如下 1.说明 自己写一个view实现每天签到的功能,设置背景图片 源码下载 2.效果...
    99+
    2022-11-12
  • Android如何自定义view实现日历打卡签到
    这篇文章主要介绍Android如何自定义view实现日历打卡签到,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备...
    99+
    2023-06-14
  • android自定义view之实现日历界面实例
    现在网上有很多自定义view实现日历的demo,今天讲一讲如何自己实现这个自定义view。 看一下最终效果图: 在这个自定义view中,我使用了各种奇技淫巧的方法来实现这个日...
    99+
    2022-06-06
    view 界面 Android
  • JavaScript自定义日历实现签到功能
    本文实例为大家分享了JavaScript自定义日历签到功能的具体代码,供大家参考,具体内容如下 先看下效果图 红色块为已签到的日期,样式可以随意更改,清晰明了,话不多说上代码: &...
    99+
    2022-11-13
  • Android如何自定义实现日历控件
    这篇文章主要介绍Android如何自定义实现日历控件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下1. Calendar类2. 布局创建calendar_layout.xml<LinearLayou...
    99+
    2023-06-25
  • Android如何实现自定义View中attrs.xml
    这篇文章主要为大家展示了“Android如何实现自定义View中attrs.xml”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android如何实现自定义View中attrs.xml”这篇文章...
    99+
    2023-05-30
    android view attrs.xml
  • 如何在Android应用中实现自定义View
    本篇文章为大家展示了如何在Android应用中实现自定义View,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android自定义view的种类自定义view大概可以分为四个大类,主要是通过实现方式...
    99+
    2023-05-31
    android view roi
  • Android如何实现自定义view画圆效果
    这篇文章主要介绍了Android如何实现自定义view画圆效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。看图代码:package sjx.com.custonv...
    99+
    2023-05-30
    android view
  • Android如何自定义view实现半圆环效果
    小编给大家分享一下Android如何自定义view实现半圆环效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下1.自定义属性<declare-s...
    99+
    2023-06-29
  • Android如何用自定义View实现雪花效果
    效果图 1.SnowView 类 package com.ilz.rocketapplication.handaccount.view; import android.co...
    99+
    2022-11-12
  • Android如何自定义View实现数字雨效果
    今天小编给大家分享一下Android如何自定义View实现数字雨效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。效果图在安...
    99+
    2023-06-29
  • 如何利用Python实现自动打卡签到的实践
    目录需求描述业务梳理程序实现总结需求描述 我们需要登录考勤系统(网页端,非手机端)进行签到,如果不想每天都早早起来打卡签到,就可以通过写程序实现这一功能。 业务梳理 通过长时间的早起...
    99+
    2022-11-12
  • Android如何实现自定义View展开菜单功能
    这篇文章主要为大家展示了“Android如何实现自定义View展开菜单功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android如何实现自定义View展开菜单功能”这篇文章吧。效果图思路下...
    99+
    2023-05-31
    android view
  • 详解Android如何自定义view实现圆形进度条
    Android中实现进度条有很多种方式,自定义进度条一般是继承progressBar或继承view来实现,本篇中讲解的是第二种方式。 先上效果图: 实现圆形进度条总体来说并不难,还...
    99+
    2022-11-13
  • 如何利用Android实现比较炫酷的自定义View
    本篇内容主要讲解“如何利用Android实现比较炫酷的自定义View”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用Android实现比较炫酷的自定义View”吧!目录一、背景1、控件效果...
    99+
    2023-06-20
  • Android如何实现自定义view圆并随手指移动
    这篇文章主要介绍了Android如何实现自定义view圆并随手指移动,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下main代码public class&...
    99+
    2023-05-30
    android view
  • 详解Android自定义view如何实现拖拽选择按钮
    小编这次要给大家分享的是详解Android自定义view如何实现拖拽选择按钮,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。本文实例为大家分享了Android实现拖拽选择按钮的具体代码,供大家参考,具体...
    99+
    2023-05-30
    android view roi
  • HTML5如何实现自定义样式与日历校验功能
    这篇文章给大家分享的是有关HTML5如何实现自定义样式与日历校验功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.日历控件自定义样式HTML5提供了日历控件功能,缩减了开发时...
    99+
    2022-10-19
  • Android如何自定义View实现横向的双水波纹进度条
    目录思路分析 功能实现 1.绘制圆角背景和圆角矩形边框 2.通过贝塞尔曲线实现双水波 3.设置动画使进度和水波纹变化 结语 网上垂直的水波纹进度条很多,但横向的很少,将垂直的水波纹改...
    99+
    2022-11-12
  • android如何实现仿即刻点赞文字部分的自定义View
    小编给大家分享一下android如何实现仿即刻点赞文字部分的自定义View,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!概述:在学习HenCoder的过程中,有一...
    99+
    2023-05-30
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作