首页 文章 精选 留言 我的

精选列表

搜索[模块],共10000篇文章
优秀的个人博客,低调大师

eBook 功能模块一之颜色选择器【ColorPickerPreference】自定义Preference 对话框

在Api Demo里面有一个叫ColorPickerDialog的对话框,该对话框扩展了Dialog 的功能,使其具备颜色选择器的功能。具体可以参考Api Demo源代码,路径为:android-sdk-windows\samples\android-7\ApiDemos\src\com \example\android\apis\graphics\ColorPickerDialog.java 本功能是基于上述的颜色选择器对话框进行扩展,模仿PreferceActivity 组件的实现方式,新建一个名为ColorPickerPreference 的类使其继承自DialogPreference 并实现其内部功能菜单,如图: 在Api Demo里面的颜色选择器是不具备有黑色和白色的选择的,这里我们虽然使用api Demo 里面的颜色选择器但其内部我们稍稍改造了一下。使其支持黑色和白色的选择,如上图中间的一条颜色条,头部和尾部分别代表黑色和白色。 为了显示的友好性,如果用户选择了颜色应该应该会有一个内容窗口或者一个文本对用户的选择做出相应的预览效果,。我们这里使用了一个TextView 做为颜色的预览效果,我们知道,Preference 的summary 只支持字符串的操作,类似下面的图: 如上图,只支持类型类型为CharSequence和字符所在的资源ID位置,那么我们这里如何使其支持颜色的显示和动态更换颜色呢? 这一切都在神奇的回调函数,onCreateView 里面这个方法先于 onBindView 执行,在里面初始化视图并且返回视图。具体处理见下面代码: @Override protected ViewonCreateView(ViewGroupparent){ // TODOAuto-generatedmethodstub Viewview = LayoutInflater.from(getContext()).inflate( R.layout.preference, null ); TextViewtitle = (TextView)view.findViewById(R.id.title); title.setText(getTitle()); summary = (TextView)view.findViewById(R.id.summary); summary.setText(getSummary()); SharedPreferencesprefs = getPreferenceManager().getSharedPreferences(); mInitialColor = prefs.getInt(getKey(),Color.LTGRAY); summary.setTextColor(mInitialColor); return view; } 上面代码,我们通过LayoutInflater 函数引入一个外部的布局文件,然后设置其title 和summary 并初始其颜色,通过SharedPreferences类调用保存后的颜色值,布局文件如下: <? xmlversion="1.0"encoding="UTF-8" ?> < LinearLayout android:id ="@+id/LinearLayout01" android:layout_width ="fill_parent" android:layout_height ="fill_parent" xmlns:android ="http://schemas.android.com/apk/res/android" > < RelativeLayout android:layout_width ="fill_parent" android:gravity ="center" android:layout_height ="fill_parent" > < TextView android:id ="@+id/title" android:layout_width ="wrap_content" android:layout_marginLeft ="15dp" android:textAppearance ="?android:attr/textAppearanceLarge" android:layout_height ="wrap_content" ></ TextView > < ImageView android:src ="@drawable/ic_dialog_menu_generic" android:layout_marginRight ="15dp" android:layout_alignParentRight ="true" android:layout_width ="wrap_content" android:layout_height ="wrap_content" ></ ImageView > < TextView android:id ="@+id/summary" android:layout_below ="@id/title" android:layout_marginLeft ="15dp" android:layout_width ="wrap_content" android:layout_height ="wrap_content" ></ TextView > </ RelativeLayout > </ LinearLayout > 实始化对话框的回调函数里面我们为其添加一个ColorPickerDialog 本身的颜色改变的事件监听并为其初始化颜色值,代码如下: @Override protected void onPrepareDialogBuilder(Builderbuilder){ super.onPrepareDialogBuilder(builder); OnColorChangedListenerl = new OnColorChangedListener(){ public void colorChanged( int color){ mCurrentColor = color; onDialogClosed( true ); getDialog().dismiss(); } }; LinearLayoutlayout = new LinearLayout(getContext()); layout.setPadding( 20 , 20 , 20 , 20 ); layout.setOrientation(LinearLayout.VERTICAL); mCPView = new ColorPickerView(getContext(),l,mInitialColor); LinearLayout.LayoutParamsparams1 = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params1.gravity = Gravity.CENTER; mCPView.setLayoutParams(params1); layout.addView( this .mCPView); layout.setId(android.R.id.widget_frame); builder.setView(layout); } 当对话框关闭时,即选择完颜色后,我们就要马上回去更新文本的颜色和将颜色值保存到键值里面,代码如下: @Override protected void onDialogClosed(booleanpositiveResult){ if (positiveResult){ mCurrentColor = mCPView.getColor(); summary.setTextColor(mCurrentColor); SharedPreferences.Editoreditor = getEditor(); editor.putInt(getKey(),mCurrentColor); editor.commit(); callChangeListener( new Integer(mCurrentColor)); } } 通过重写,onDialogClosed 回调函数,到这一步整个的封装就己结束,在XML可以通过如下使用: < com.terry.util.ColorPickerPreference android:key ="colorpiker" android:persistent ="true" android:summary ="@string/app_name" android:dialogTitle ="@string/str_fontscolor" android:title ="@string/str_fontscolor" /> Tip:自己封装控件不论是自定义控件也好,preference 也好在XML里面都是无法智能提示的,只要自己把握好输入的属性准确无误就行。 完整代码如下: packagecom.terry.util; importandroid.app.AlertDialog.Builder; importandroid.content.Context; importandroid.content.SharedPreferences; importandroid.graphics.Canvas; importandroid.graphics.Color; importandroid.graphics.LinearGradient; importandroid.graphics.Paint; importandroid.graphics.RectF; importandroid.graphics.Shader; importandroid.graphics.SweepGradient; importandroid.preference.DialogPreference; importandroid.util.AttributeSet; importandroid.view.Gravity; importandroid.view.LayoutInflater; importandroid.view.MotionEvent; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.LinearLayout; importandroid.widget.TextView; importcom.terry.eBook.R; public class ColorPickerPreferenceextendsDialogPreference{ private int mInitialColor; private int mCurrentColor; private ColorPickerViewmCPView; private TextViewsummary; private static class ColorPickerViewextendsView{ private PaintmPaint; private PaintmCenterPaint; private PaintmHSVPaint; private final int []mColors; private int []mHSVColors; private booleanmRedrawHSV; private OnColorChangedListenermListener; ColorPickerView(Contextc,OnColorChangedListenerl, int color){ super(c); mListener = l; mColors = new int []{ 0xFFFF0000 , 0xFFFF00FF , 0xFF0000FF , 0xFF00FFFF , 0xFF00FF00 , 0xFFFFFF00 , 0xFFFF0000 }; Shaders = new SweepGradient( 0 , 0 ,mColors, null ); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setShader(s); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth( 55 ); mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mCenterPaint.setColor(color); mCenterPaint.setStrokeWidth( 5 ); mHSVColors = new int []{ 0xFF000000 ,color, 0xFFFFFFFF }; mHSVPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mHSVPaint.setStrokeWidth( 10 ); mRedrawHSV = true ; } private booleanmTrackingCenter; private booleanmHighlightCenter; public int getColor(){ return mCenterPaint.getColor(); } @Override protected void onDraw(Canvascanvas){ float r = CENTER_X - mPaint.getStrokeWidth() * 0.5f ; canvas.translate(CENTER_X,CENTER_X); int c = mCenterPaint.getColor(); if (mRedrawHSV){ mHSVColors[ 1 ] = c; mHSVPaint.setShader( new LinearGradient( - 100 , 0 , 100 , 0 , mHSVColors, null ,Shader.TileMode.CLAMP)); } canvas.drawOval( new RectF( - r, - r,r,r),mPaint); canvas.drawCircle( 0 , 0 ,CENTER_RADIUS,mCenterPaint); canvas.drawRect( new RectF( - 100 , 130 , 100 , 110 ),mHSVPaint); if (mTrackingCenter){ mCenterPaint.setStyle(Paint.Style.STROKE); if (mHighlightCenter){ mCenterPaint.setAlpha( 0xFF ); } else { mCenterPaint.setAlpha( 0x80 ); } canvas.drawCircle( 0 , 0 ,CENTER_RADIUS + mCenterPaint.getStrokeWidth(),mCenterPaint); mCenterPaint.setStyle(Paint.Style.FILL); mCenterPaint.setColor(c); } mRedrawHSV = true ; } @Override protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec){ setMeasuredDimension(CENTER_X * 2 ,(CENTER_Y + 25 ) * 2 ); } private static final int CENTER_X = 100 ; private static final int CENTER_Y = 100 ; private static final int CENTER_RADIUS = 30 ; private int ave( int s, int d, float p){ return s + java.lang.Math.round(p * (d - s)); } private int interpColor( int colors[], float unit){ if (unit <= 0 ){ return colors[ 0 ]; } if (unit >= 1 ){ return colors[colors.length - 1 ]; } float p = unit * (colors.length - 1 ); int i = ( int )p; p -= i; // nowpisjustthefractionalpart[0...1)andiistheindex int c0 = colors[i]; int c1 = colors[i + 1 ]; int a = ave(Color.alpha(c0),Color.alpha(c1),p); int r = ave(Color.red(c0),Color.red(c1),p); int g = ave(Color.green(c0),Color.green(c1),p); int b = ave(Color.blue(c0),Color.blue(c1),p); return Color.argb(a,r,g,b); } private static final float PI = 3.1415926f ; @Override public booleanonTouchEvent(MotionEvent event ){ float x = event .getX() - CENTER_X; float y = event .getY() - CENTER_Y; booleaninCenter = java.lang.Math.sqrt(x * x + y * y) <= CENTER_RADIUS; switch ( event .getAction()){ case MotionEvent.ACTION_DOWN: mTrackingCenter = inCenter; if (inCenter){ mHighlightCenter = true ; invalidate(); break ; } case MotionEvent.ACTION_MOVE: if (mTrackingCenter){ if (mHighlightCenter != inCenter){ mHighlightCenter = inCenter; invalidate(); } } else if ((x >= - 100 & x <= 100 ) && (y <= 130 && y >= 110 )) // see // if // we're // in // the // hsv // slider { int a,r,g,b,c0,c1; float p; // setthecenterpainttothiscolor if (x < 0 ){ c0 = mHSVColors[ 0 ]; c1 = mHSVColors[ 1 ]; p = (x + 100 ) / 100 ; } else { c0 = mHSVColors[ 1 ]; c1 = mHSVColors[ 2 ]; p = x / 100 ; } a = ave(Color.alpha(c0),Color.alpha(c1),p); r = ave(Color.red(c0),Color.red(c1),p); g = ave(Color.green(c0),Color.green(c1),p); b = ave(Color.blue(c0),Color.blue(c1),p); mCenterPaint.setColor(Color.argb(a,r,g,b)); mRedrawHSV = false ; invalidate(); } else { float angle = ( float )java.lang.Math.atan2(y,x); // needtoturnangle[-PI...PI]intounit[0....1] float unit = angle / ( 2 * PI); if (unit < 0 ){ unit += 1 ; } mCenterPaint.setColor(interpColor(mColors,unit)); invalidate(); } break ; case MotionEvent.ACTION_UP: if (mTrackingCenter){ if (inCenter){ mListener.colorChanged(mCenterPaint.getColor()); } mTrackingCenter = false ; // sowedraww/ohalo invalidate(); } break ; } return true ; } } public interface OnColorChangedListener{ void colorChanged( int color); } public ColorPickerPreference(Contextcontex){ this (contex, null ); } public ColorPickerPreference(Contextcontext,AttributeSetattrs){ super(context,attrs); } public ColorPickerPreference(Contextcontext,AttributeSetattrs, int defStyle){ super(context,attrs,defStyle); } @Override protected void onDialogClosed(booleanpositiveResult){ if (positiveResult){ mCurrentColor = mCPView.getColor(); summary.setTextColor(mCurrentColor); SharedPreferences.Editoreditor = getEditor(); editor.putInt(getKey(),mCurrentColor); editor.commit(); callChangeListener( new Integer(mCurrentColor)); } } @Override protected ViewonCreateView(ViewGroupparent){ // TODOAuto-generatedmethodstub Viewview = LayoutInflater.from(getContext()).inflate( R.layout.preference, null ); TextViewtitle = (TextView)view.findViewById(R.id.title); title.setText(getTitle()); summary = (TextView)view.findViewById(R.id.summary); summary.setText(getSummary()); SharedPreferencesprefs = getPreferenceManager().getSharedPreferences(); mInitialColor = prefs.getInt(getKey(),Color.LTGRAY); summary.setTextColor(mInitialColor); return view; } @Override protected void onPrepareDialogBuilder(Builderbuilder){ super.onPrepareDialogBuilder(builder); OnColorChangedListenerl = new OnColorChangedListener(){ public void colorChanged( int color){ mCurrentColor = color; onDialogClosed( true ); getDialog().dismiss(); } }; LinearLayoutlayout = new LinearLayout(getContext()); layout.setPadding( 20 , 20 , 20 , 20 ); layout.setOrientation(LinearLayout.VERTICAL); mCPView = new ColorPickerView(getContext(),l,mInitialColor); LinearLayout.LayoutParamsparams1 = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params1.gravity = Gravity.CENTER; mCPView.setLayoutParams(params1); layout.addView( this .mCPView); layout.setId(android.R.id.widget_frame); builder.setView(layout); } } 完。 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/393621,如需转载请自行联系原作者

优秀的个人博客,低调大师

《深入理解Nginx:模块开发与架构解析》一3.8 将磁盘文件作为包体发送

3.8 将磁盘文件作为包体发送 上文讨论了如何将内存中的数据作为包体发送给客户端,而在发送文件时完全可以先把文件读取到内存中再向用户发送数据,但是这样做会有两个缺点:为了不阻塞Nginx,每次只能读取并发送磁盘中的少量数据,需要反复持续多次。Linux上高效的sendfile系统调用不需要先把磁盘中的数据读取到用户态内存再发送到网络中。当然,Nginx已经封装好了多种接口,以便将磁盘或者缓存中的文件发送给用户。 3.8.1 如何发送磁盘中的文件 发送文件时使用的是3.7节中所介绍的接口。例如: ngx_chain_t out; out.buf = b; out.next = NULL; return ngx_http_output_filter(r, &out); 两者不同的地方在于如何设置ngx_buf_t缓冲区。在3.2.5

优秀的个人博客,低调大师

张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块

HC-SR04采用IO触发测距。下面介绍一下其在 Windows 10 IoT Core 环境下的用法。 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码。 1. 准备 HC-SR04 ×1 Raspberry Pi 2/3 ×1 公母头杜邦线 ×4 2. 连线 Vcc - 5V Gnd - GND Trig - GPIO 17 - Pin 11 Echo - GPIO 27 - Pin 13 3. 代码 GitHub :https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/HC_SR04Demo 你需要在项目中添加一个 C# 代码文件 HCSR04.cs,将下面的代码复制粘贴,并且不要忘记添加引用Windows IoT Extensions for the UWP using System.Diagnostics; using System.Threading.Tasks; using Windows.Devices.Gpio; namespace HC_SR04Demo { class HCSR04 { private int sensorTrig; private int sensorEcho; private GpioPin pinTrig; private GpioPin pinEcho; Stopwatch time = new Stopwatch(); /// <summary> /// Constructor /// </summary> /// <param name="trig">Trig Pin</param> /// <param name="echo">Echo Pin</param> public HCSR04(int trig, int echo) { sensorTrig = trig; sensorEcho = echo; } /// <summary> /// Initialize the sensor /// </summary> public void Initialize() { var gpio = GpioController.GetDefault(); pinTrig = gpio.OpenPin(sensorTrig); pinEcho = gpio.OpenPin(sensorEcho); pinTrig.SetDriveMode(GpioPinDriveMode.Output); pinEcho.SetDriveMode(GpioPinDriveMode.Input); pinTrig.Write(GpioPinValue.Low); } /// <summary> /// Read data from the sensor /// </summary> /// <returns>A double type distance data</returns> public async Task<double> ReadAsync() { double result; pinTrig.Write(GpioPinValue.High); await Task.Delay(10); pinTrig.Write(GpioPinValue.Low); while (pinEcho.Read() == GpioPinValue.Low) { } time.Restart(); while (pinEcho.Read() == GpioPinValue.High) { } time.Stop(); result = (time.Elapsed.TotalSeconds * 34000) / 2; return result; } /// <summary> /// Cleanup /// </summary> public void Dispose() { pinTrig.Dispose(); pinEcho.Dispose(); } } } 4. 如何使用 第一步调用构造函数将 HCSR04 实例化,请传入 Trig 和 Echo 的连接值 第二步调用Initialize() 初始化设备 第三步调用ReadAsync() 读取数据,返回的是一个 double 类型的值 当需要关闭设备时,调用Dispose() 详见 GitHub

优秀的个人博客,低调大师

🔥🔥Skyeye 云零代码智能制造系统 - 基础功能模块 - v3.19.4 发布

Skyeye 云智能制造,智能制造一体化,采用 SpringBoot+ UNI-APP + Ant Design Vue 的零代码平台开发模式。包含 100 多种电子流程,CRM、PM、ERP、MES、ADM、OA、EHR、AI、项目、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、问卷、报表设计、工作流、Saas 等功能。打造全网首套零代码、功能最全的智能制造行业供应链一体化管理软件。 官方网站 开发文档 视频教程 功能点 Skyeye云【源代码】针对 {Skyeye 会员} 开源。拿到源码后可进行学习、毕设、企业等使用。 Skyeye 云智能制造 v3.19.4 发布 ,发布内容如下: Skyeye 云已加入 Dromara 社区 高级搜索配置支持枚举、数据字典等数据类型,同时日期的数据类型支持格式筛选,用户的数据类型支持范围筛选 MES加工单支持数据权限管控,支持PC端和移动端 PC 端高级搜索配置,已完成 80% 自动化平台重构完成 80% PC 端商城重构完成 85% 移动端部分VUE2的语法重构为VUE3的语法格式 修复上个版本的bug 源代码只对 Skyeye 会员开放 Skyeye 具备低代码、快捷开发、可视化设计、微服务等特点,方便客户二次开发,极大的提高了开发效率。 项目地址: Gitee: https://gitee.com/doc_wei01/skyeye https://gitee.com/dromara/skyeye GitCode: https://gitcode.com/doc_wei/erp-pro https://gitcode.com/doc_wei/skyeye-oa Skyeye 云各种设计器效果图 效果图 效果图 管理端移动端效果图 效果图 效果图 效果图 效果图 商城 PC 端效果图 效果图 效果图 效果图 效果图 商城移动端效果图 效果图 效果图 效果图 效果图

优秀的个人博客,低调大师

🔥🔥Skyeye 云零代码智能制造系统 - 基础功能模块 - v3.19.3 发布

Skyeye 云智能制造,智能制造一体化,采用 SpringBoot+ UNI-APP + Ant Design Vue 的零代码平台开发模式。包含 100 多种电子流程,CRM、PM、ERP、MES、ADM、OA、EHR、AI、项目、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、问卷、报表设计、工作流、Saas 等功能。打造全网首套零代码、功能最全的智能制造行业供应链一体化管理软件。 官方网站 开发文档 视频教程 功能点 Skyeye云【源代码】针对 {Skyeye 会员} 开源。拿到源码后可进行学习、毕设、企业等使用。 Skyeye 云智能制造 v3.19.3 发布 ,发布内容如下: Skyeye 云已加入 Dromara 社区 新增操作日志定时删除功能 新增操作日志统计报表 webSocket支持微服务 PC端高级搜索配置,已完成40% 移动管理端新增国际化,全量国际化已完成30% 自动化平台重构完成 40% PC 端商城重构完成 45% 源代码只对 Skyeye 会员开放 Skyeye 具备低代码、快捷开发、可视化设计、微服务等特点,方便客户二次开发,极大的提高了开发效率。 项目地址: Gitee: https://gitee.com/doc_wei01/skyeye https://gitee.com/dromara/skyeye GitCode: https://gitcode.com/doc_wei/erp-pro https://gitcode.com/doc_wei/skyeye-oa Skyeye 云各种设计器效果图 效果图 效果图 管理端移动端效果图 效果图 效果图 效果图 效果图 商城 PC 端效果图 效果图 效果图 效果图 效果图 商城移动端效果图 效果图 效果图 效果图 效果图

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册