一步一步走向自定义控件

Android多图加载成动画 依赖的空白工程可以参考 优快云https://mp.youkuaiyun.com/mp_blog/creation/editor/123544107 使用Android官方动画工具 AnimationDrawable animationDrawable = new AnimationDrawable();//初始化 设置 animationDrawable.addFrame(drawable, 1000);//添加图片生成的drawable,时间为1000ms animationDrawable.set 阅读详情

上个月搭配了自己的开发环境。
有了自己的环境=有了环境想搞事情。
然后这个月就想搞搞事情了。
自定义控件确实很强大,看到灵机上的OppositeLayout不禁深深钦佩。
其实一直想自定义控件,但是到底怎么自定义的呢,需要怎么样去学呢?我也不怎么晓得。
我比较笨–>我的想法是一步一步慢慢探索,摸着石头过河。–>会用别人定义的–>看懂别人的代码–>模仿着来写–>写自己的


大神博客



自定义dialog

这个自定义dialog的灵感来自于加载动画–>
正常来说我们可以先写一个BaseDialog

BaseDialog

/**
 * <b>Project:</b> ${file_name}<br>
 * <b>Create Date:</b> 2017/3/18<br>
 * <b>Author:</b> Tongson<br>
 * <b>Description:</b> Tongson's Dialog的爸爸 <br>
 */

public abstract class TongsonBaseDialog extends Dialog {

    private Context mContext;

    public TongsonBaseDialog(Context context) {
        super(context, R.style.TongsonBaseDialogStyle);
        mContext = context;
        initEnterExitAnim();
    }

    public TongsonBaseDialog(Context context, int theme) {
        super(context, theme);
        mContext = context;
        initEnterExitAnim();
    }

    /**
     * 进场动画
     */
    public void initEnterExitAnim() {
        Window dialogWindow = getWindow();
        dialogWindow.setGravity(Gravity.CENTER); // 此处可以设置dialog显示的位置为居中
        dialogWindow.setWindowAnimations(R.style.dialogWindowAnim);// 添加动画效果
        int widthPixels;
        int heightPixels;
        WindowManager.LayoutParams layoutParams = dialogWindow.getAttributes();
        DisplayMetrics dm = getContext().getResources().getDisplayMetrics();
        widthPixels = dm.widthPixels;
        heightPixels = dm.heightPixels;
        layoutParams.height = heightPixels;
        layoutParams.width = widthPixels;
        dialogWindow.setAttributes(layoutParams);
    }
}

BaseDialog:身为一个dialog的爸爸应该怎么去写?我的话开始的时候写得不多,感觉不需要写太多–>先写孩纸,然后把孩纸的共同点交给爸爸。爸爸是有很多共同点的存在,而孩纸是青出于蓝而胜于蓝的存在。

R.style.dialogWindowAnim:这个就是动画效果。先讲完dialog的,动画等等再说。

ChildrenDialog

然后我们来看看这个孩纸的dialog怎么去写呢?
在项目里,我们有各种各样的dialog
而且根据需求会写各种各样的dialog,那我们就写呗

列举一下项目中我们都有用到的dialog

  • LoadingDialog
  • GetPhotoDialog
  • TipsDialog
  • PayDialog
  • PermissionDialog
  • ExitDialog
  • DownloadDialog

等等

关键代码
        setContentView(R.layout.dialog_layout);

然后自己想干嘛干嘛。哈。哈。

Animation

感觉是很重要的,Dialog飞来飞去的炫酷感会使用户飞。

怎么加入自己想要的动画呢?

这个开始我也不大会,然后就找别人的代码啊。

https://github.com/gepriniusce/NiftyDialogEffects
https://github.com/gepriniusce/NiftyNotification

核心代码
        this.setOnShowListener(new OnShowListener() {
            @Override
            public void onShow(DialogInterface dialogInterface) {

                mLinearLayoutView.setVisibility(View.VISIBLE);
                if (type == null) {
                    type = Effectstype.Slidetop;
                }
                start(type);


            }
        });
    private void start(Effectstype type) {
        BaseEffects animator = type.getAnimator();
        if (mDuration != -1) {
            animator.setDuration(Math.abs(mDuration));
        }
        animator.start(mRelativeLayoutView);
    }

其实原理很简单,dialog有一个OnShowListener,然后再start动画!

Dialog

其实自定义Dialog的话,还是要多看看Dialog这个类的代码,我们重写一下方法就行了是不是好简单!?


自定义TextView

对于自定义的TextView感觉比较有用的是setTypeface(加载自己的字体库)

直接看代码吧–>

/**
 * <b>Project:</b> ${file_name}<br>
 * <b>Create Date:</b> 2017/4/4<br>
 * <b>Author:</b> Tongson<br>
 * <b>Description:</b>  自定义字体库TextView <br>
 */
public class TongsonTextView extends TextView {

    public static Typeface myTypeface;

    public TongsonTextView(Context context) {
        super(context);
        setTTFstyle();
    }

    public TongsonTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTTFstyle();
    }

    public TongsonTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setTTFstyle();
    }

    private void setTTFstyle() {
        Typeface typeface= getTtf();
        if (null != typeface) {
            setTypeface(typeface);
        }
    }


    /**
     * 加载字体库
     * <p>
     * 此处应该在Application中
     *
     * @param context
     */
    public static void loadTtf(Context context) {
        Typeface fontFace = null;
        try {
            fontFace = Typeface.createFromAsset(context.getAssets(), "fonts/msyhl.ttc");
        } catch (RuntimeException e) {
            e.printStackTrace();
        }
        if (fontFace != null) {
            myTypeface = fontFace;
        }
    }

    /**
     * 获取字体
     *
     * @return
     */
    private Typeface getTtf() {
        return myTypeface;
    }
}

核心代码

setTypeface(typeface);

自定义Button

Button的话个人比较喜欢StateButton
https://github.com/niniloveyou/StateButton

先看懂大神代码吧–>

values中的attrs –>自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    </declare-styleable>
        <declare-styleable name="StateButton">
        <attr name="xxx" format="xxx|reference"/>
    </declare-styleable>
</resources>

获取attrs属性
利用这些属性与GradientDrawable对控件的属性做设置
真的写得不错的代码,觉得很值得我学习

StateButton

public class StateButton extends AppCompatButton {

    //text color
    private int mNormalTextColor = 0;
    private int mPressedTextColor = 0;
    private int mUnableTextColor = 0;
    ColorStateList mTextColorStateList;

    //animation duration
    private int mDuration = 0;

    //radius
    private float mRadius = 0;
    private boolean mRound;

    //stroke
    private float mStrokeDashWidth = 0;
    private float mStrokeDashGap = 0;
    private int mNormalStrokeWidth = 0;
    private int mPressedStrokeWidth = 0;
    private int mUnableStrokeWidth = 0;
    private int mNormalStrokeColor = 0;
    private int mPressedStrokeColor = 0;
    private int mUnableStrokeColor = 0;

    //background color
    private int mNormalBackgroundColor = 0;
    private int mPressedBackgroundColor = 0;
    private int mUnableBackgroundColor = 0;

    private GradientDrawable mNormalBackground;
    private GradientDrawable mPressedBackground;
    private GradientDrawable mUnableBackground;

    private int[][] states;

    StateListDrawable mStateBackground;

    public StateButton(Context context) {
        this(context, null);
    }

    public StateButton(Context context, AttributeSet attrs) {
        this(context, attrs, android.support.v7.appcompat.R.attr.buttonStyle);
    }

    public StateButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setup(attrs);
    }

    private void setup(AttributeSet attrs) {

        states = new int[4][];

        Drawable drawable = getBackground();
        if(drawable != null && drawable instanceof StateListDrawable){
            mStateBackground = (StateListDrawable) drawable;
        }else{
            mStateBackground = new StateListDrawable();
        }

        mNormalBackground = new GradientDrawable();
        mPressedBackground = new GradientDrawable();
        mUnableBackground = new GradientDrawable();

        //pressed, focused, normal, unable
        states[0] = new int[] { android.R.attr.state_enabled, android.R.attr.state_pressed };
        states[1] = new int[] { android.R.attr.state_enabled, android.R.attr.state_focused };
        states[3] = new int[] { -android.R.attr.state_enabled};
        states[2] = new int[] { android.R.attr.state_enabled };

        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.StateButton);

        //get original text color as default
        //set text color
        mTextColorStateList = getTextColors();
        int mDefaultNormalTextColor = mTextColorStateList.getColorForState(states[2], getCurrentTextColor());
        int mDefaultPressedTextColor = mTextColorStateList.getColorForState(states[0], getCurrentTextColor());
        int mDefaultUnableTextColor = mTextColorStateList.getColorForState(states[3], getCurrentTextColor());
        mNormalTextColor = a.getColor(R.styleable.StateButton_normalTextColor, mDefaultNormalTextColor);
        mPressedTextColor = a.getColor(R.styleable.StateButton_pressedTextColor, mDefaultPressedTextColor);
        mUnableTextColor = a.getColor(R.styleable.StateButton_unableTextColor, mDefaultUnableTextColor);
        setTextColor();

        //set animation duration
        mDuration = a.getInteger(R.styleable.StateButton_animationDuration, mDuration);
        mStateBackground.setEnterFadeDuration(mDuration);
        mStateBackground.setExitFadeDuration(mDuration);

        //set background color
        mNormalBackgroundColor = a.getColor(R.styleable.StateButton_normalBackgroundColor, 0);
        mPressedBackgroundColor = a.getColor(R.styleable.StateButton_pressedBackgroundColor, 0);
        mUnableBackgroundColor = a.getColor(R.styleable.StateButton_unableBackgroundColor, 0);
        mNormalBackground.setColor(mNormalBackgroundColor);
        mPressedBackground.setColor(mPressedBackgroundColor);
        mUnableBackground.setColor(mUnableBackgroundColor);

        //set radius
        mRadius = a.getDimensionPixelSize(R.styleable.StateButton_radius, 0);
        mRound = a.getBoolean(R.styleable.StateButton_round, false);
        mNormalBackground.setCornerRadius(mRadius);
        mPressedBackground.setCornerRadius(mRadius);
        mUnableBackground.setCornerRadius(mRadius);

        //set stroke
        mStrokeDashWidth = a.getDimensionPixelSize(R.styleable.StateButton_strokeDashWidth, 0);
        mStrokeDashGap = a.getDimensionPixelSize(R.styleable.StateButton_strokeDashWidth, 0);
        mNormalStrokeWidth = a.getDimensionPixelSize(R.styleable.StateButton_normalStrokeWidth, 0);
        mPressedStrokeWidth = a.getDimensionPixelSize(R.styleable.StateButton_pressedStrokeWidth, 0);
        mUnableStrokeWidth = a.getDimensionPixelSize(R.styleable.StateButton_unableStrokeWidth, 0);
        mNormalStrokeColor = a.getColor(R.styleable.StateButton_normalStrokeColor, 0);
        mPressedStrokeColor = a.getColor(R.styleable.StateButton_pressedStrokeColor, 0);
        mUnableStrokeColor = a.getColor(R.styleable.StateButton_unableStrokeColor, 0);
        setStroke();

        //set background
        mStateBackground.addState(states[0], mPressedBackground);
        mStateBackground.addState(states[1], mPressedBackground);
        mStateBackground.addState(states[3], mUnableBackground);
        mStateBackground.addState(states[2], mNormalBackground);
        setBackgroundDrawable(mStateBackground);
        a.recycle();
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setRound(mRound);
    }

    /****************** stroke color *********************/

    public void setNormalStrokeColor(@ColorInt int normalStrokeColor) {
        this.mNormalStrokeColor = normalStrokeColor;
        setStroke(mNormalBackground, mNormalStrokeColor, mNormalStrokeWidth);
    }

    public void setPressedStrokeColor(@ColorInt int pressedStrokeColor) {
        this.mPressedStrokeColor = pressedStrokeColor;
        setStroke(mPressedBackground, mPressedStrokeColor, mPressedStrokeWidth);
    }

    public void setUnableStrokeColor(@ColorInt int unableStrokeColor) {
        this.mUnableStrokeColor = unableStrokeColor;
        setStroke(mUnableBackground, mUnableStrokeColor, mUnableStrokeWidth);
    }

    public void setStateStrokeColor(@ColorInt int normal, @ColorInt int pressed, @ColorInt int unable){
        mNormalStrokeColor = normal;
        mPressedStrokeColor = pressed;
        mUnableStrokeColor = unable;
        setStroke();
    }

    /****************** stroke width *********************/

    public void setNormalStrokeWidth(int normalStrokeWidth) {
        this.mNormalStrokeWidth = normalStrokeWidth;
        setStroke(mNormalBackground, mNormalStrokeColor, mNormalStrokeWidth);
    }

    public void setPressedStrokeWidth(int pressedStrokeWidth) {
        this.mPressedStrokeWidth = pressedStrokeWidth;
        setStroke(mPressedBackground, mPressedStrokeColor, mPressedStrokeWidth);
    }

    public void setUnableStrokeWidth(int unableStrokeWidth) {
        this.mUnableStrokeWidth = unableStrokeWidth;
        setStroke(mUnableBackground, mUnableStrokeColor, mUnableStrokeWidth);
    }

    public void setStateStrokeWidth(int normal, int pressed, int unable){
        mNormalStrokeWidth = normal;
        mPressedStrokeWidth = pressed;
        mUnableStrokeWidth= unable;
        setStroke();
    }

    public void setStrokeDash(float strokeDashWidth, float strokeDashGap) {
        this.mStrokeDashWidth = strokeDashWidth;
        this.mStrokeDashGap = strokeDashWidth;
        setStroke();
    }

    private void setStroke(){
        setStroke(mNormalBackground, mNormalStrokeColor, mNormalStrokeWidth);
        setStroke(mPressedBackground, mPressedStrokeColor, mPressedStrokeWidth);
        setStroke(mUnableBackground, mUnableStrokeColor, mUnableStrokeWidth);
    }

    private void setStroke(GradientDrawable mBackground, int mStrokeColor, int mStrokeWidth) {
        mBackground.setStroke(mStrokeWidth, mStrokeColor, mStrokeDashWidth, mStrokeDashGap);
    }

    /********************   radius  *******************************/

    public void setRadius(@FloatRange(from = 0) float radius) {
        this.mRadius = radius;
        mNormalBackground.setCornerRadius(mRadius);
        mPressedBackground.setCornerRadius(mRadius);
        mUnableBackground.setCornerRadius(mRadius);
    }

    public void setRound(boolean round){
        this.mRound = round;
        int height = getMeasuredHeight();
        if(mRound){
            setRadius(height / 2f);
        }
    }

    public void setRadius(float[] radii){
        mNormalBackground.setCornerRadii(radii);
        mPressedBackground.setCornerRadii(radii);
        mUnableBackground.setCornerRadii(radii);
    }

    /********************  background color  **********************/

    public void setStateBackgroundColor(@ColorInt int normal, @ColorInt int pressed, @ColorInt int unable){
        mPressedBackgroundColor = normal;
        mNormalBackgroundColor = pressed;
        mUnableBackgroundColor = unable;
        mNormalBackground.setColor(mNormalBackgroundColor);
        mPressedBackground.setColor(mPressedBackgroundColor);
        mUnableBackground.setColor(mUnableBackgroundColor);
    }

    public void setNormalBackgroundColor(@ColorInt int normalBackgroundColor) {
        this.mNormalBackgroundColor = normalBackgroundColor;
        mNormalBackground.setColor(mNormalBackgroundColor);
    }

    public void setPressedBackgroundColor(@ColorInt int pressedBackgroundColor) {
        this.mPressedBackgroundColor = pressedBackgroundColor;
        mPressedBackground.setColor(mPressedBackgroundColor);
    }

    public void setUnableBackgroundColor(@ColorInt int unableBackgroundColor) {
        this.mUnableBackgroundColor = unableBackgroundColor;
        mUnableBackground.setColor(mUnableBackgroundColor);
    }

    /*******************alpha animation duration********************/
    public void setAnimationDuration(@IntRange(from = 0)int duration){
        this.mDuration = duration;
        mStateBackground.setEnterFadeDuration(mDuration);
    }

    /***************  text color   ***********************/

    private void setTextColor() {
        int[] colors = new int[] {mPressedTextColor, mPressedTextColor, mNormalTextColor, mUnableTextColor};
        mTextColorStateList = new ColorStateList(states, colors);
        setTextColor(mTextColorStateList);
    }

    public void setStateTextColor(@ColorInt int normal, @ColorInt int pressed, @ColorInt int unable){
        this.mNormalTextColor = normal;
        this.mPressedTextColor = pressed;
        this.mUnableTextColor = unable;
        setTextColor();
    }

    public void setNormalTextColor(@ColorInt int normalTextColor) {
        this.mNormalTextColor = normalTextColor;
        setTextColor();

    }

    public void setPressedTextColor(@ColorInt int pressedTextColor) {
        this.mPressedTextColor = pressedTextColor;
        setTextColor();
    }

    public void setUnableTextColor(@ColorInt int unableTextColor) {
        this.mUnableTextColor = unableTextColor;
        setTextColor();
    }
}

神一样的控件自定义FrameLayout

这个就是公司的OppositeLayout
好强大,也是看懂代码先,然后一步一步学习,代码看多了,敲多了就会自己写了嘛。

代码不晓得贴不贴不出来好[捂脸]。


以上的算是自定义控件的一个入门吧。

自定义View

回过头来,我们可以再看看大神的博客

大神博客

更详细的入门教程。

总结

如果想真正弄明白怎样自定义View,绘制各种View,还是要先把基础搞好,参考优秀代码,多敲大神demo,学着写,自己写。

先睡觉,以后再补充

SOUI之DIY: 自定义控件和消息实现 一、引言使用 SOUI 的过程是一个漫长的学习过程,必然要以需求驱使着,才能够促使自己去探索其内部的原理。最近有一个想法: 将一个导航条封装成一个控件类,但是导航条里面众多的按钮消息应该如何封装成自定义消息呢? 我想要不论点击哪个按钮,也只需要外部监控一个事件消息来处理即可。这样子,对于外部来说,这个控件就是完整的封装良好的个体。 那么自定义控件的方法,SOUI 的博客上已经有过描述了,但 阅读详情

相关推荐

WPF自定义树形表格控件:从控件模板到数据绑定的完整实践

本文详细介绍了如何从零开始构建一个功能完整的WPF树形表格控件(TreeListView)。通过自定义控件模板、解决列头与内容滚动同步难题、改造TreeViewItem为表格行,并实现展开/收起按钮与层级数据绑定,为开发ERP、文件管理器等需要同时展示层级结构与详细数据的应用提供了完整的自定义控件实践方案。

f6g7h8i9j的博客 243

java 制作自定义控件_自定义控件的三种方式

文章转载于https://blog.youkuaiyun.com/fictionss/article/details/78285167原生控件,自己绘制和继承原生控件.1.组合原生控件将自己需要的控件组合起来变成一个新控件,如下制作常见的app页面头部.新建一个Android项目,创建一个头部布局view_top.xmlandroid:layout_width="match_parent"android:la...

weixin_39723920的博客 657

从零实现:基于LVGL的自定义控件渲染逻辑

深入剖析LVGL框架下的控件绘制机制,从零开始构建自定义控件的完整渲染流程,掌握lvgl核心绘图原理与实际应用技巧。

weixin_42376614的博客 565

Swing-自定义控件(开关绘制)

设计思路: 1、开关按钮绘制 原理: 对绘制的图像面板添加鼠标点击事件,每点击一次,切换一次显示状态 2、布局(自定义布局...........) MyFrame: package Swing0501; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayou...

给你更好的 2484

Java生成自定义控件源代码

摘要:Java源码,初学实例,自定义控件  Java生成自定义控件源代码,颜色选择下拉框演示,带图标下拉框的单元绘制器,从JLabel类扩展,实现ListCellRenderer接口,采用Object二维数组,用于初始化下拉框,参数依次为图标,显示文本,提示文本,初学者参考。

ArcGIS新手必看:HWSD2土壤数据从下载到批量提取TIFF的完整流程

本文详细介绍了ArcGIS中HWSD2土壤数据的完整处理流程,从数据下载、预处理到批量提取TIFF文件。涵盖栅格属性表构建、属性数据连接及性能优化等关键步骤,帮助新手高效掌握HWSD2数据提取技术,提升地理信息数据处理效率。

ll5678的博客 1036

swing204自定义控件

自定义控件 package my; import javax.swing.*; public class Swing2 { public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createGUI();

dingpython的博客 526

从零开始:用AutoLisp为AutoCAD定制专属工具栏(2023最新版)

本文详细介绍了如何利用AutoLisp语言为AutoCAD定制专属工具栏,以提升绘图效率。内容涵盖从环境配置、AutoLisp基础语法到实战开发的全过程,指导用户编写自动化脚本、封装功能函数,并最终通过CUI编辑器创建和部署个性化工具栏按钮,是2023年CAD用户实现工作流自动化与个性化的实用指南。

4k5l6j7h8的博客 300

自定义控件其实很简单1/12

自定义View,很多初学Android的童鞋听到这么一句话绝逼是一脸膜拜!因为在很多初学者眼里,能够自己去画一个View绝逼是一件很屌很Cool的事!但是,同样而言,自定义View对初学者来说却往往可望而不可及,可望是因为看了很多自定义View的源码好像并不难,有些自定义View甚至不足百行代码,不可及呢是因为即便看了很多文章很多类似的源码依然写不出一个霸气的View来。这时会有很多前辈告诉你多看

AigeStudio 6万+

解决uc浏览器劫持video标签问题

解决uc视频悬浮播放 ,video标签被浏览器劫持 ,vide0适配

smile_y_y的博客 3452

手把手打通全流程:在华为昇腾310/Atlas 200DK上实现深度学习模型从移植到部署

通过以上步骤,你已成功在华为昇腾310 Atlas 200DK上完成深度学习模型的移植与推理。这一流程可复用到目标检测、语义分割等其他任务,快去尝试将自己的AI模型部署到昇腾设备上,打造属于你的边缘智能应用吧!上部署深度学习模型,这篇教程将带你走完从模型转换到推理运行的完整流程。无需担心技术壁垒,我们以通俗易懂的方式拆解每一步,让你轻松在昇腾嵌入式设备上实现AI应用。是专为边缘AI设计的高性能处理器,Atlas 200DK是其开发板形态,能高效运行图像分类、目标检测等深度学习任务。

FJN110的博客 183

C#自定义控件一步一步走

转自:http://bbs.youkuaiyun.com/topics/90150862 最近用C#做mobile,但发现在windows mobile中可用的控件太少,只好自己定义了,下面以自定义一个button为例来说说C#中自定义控件如何做. (先说明一下,我用的是.net2005) 一.新建一个控件库项目. 二.想好要定义控件的需求:能设定字体,设定背景色和前景色,字符对齐方式,有一个

菊花古剑和酒的专栏 604

提交 ieee 手稿出现:Do not include the Reviewer PDF with my submission 怎么办

IEEE投稿Reviewer PDF选项说明 投稿时出现的"Do not include the Reviewer PDF with my submission"选项控制是否附带评审专用PDF文件。Reviewer PDF是系统自动生成包含所有投稿材料的完整PDF,用于同行评审。建议保持默认不勾选状态,除非确认编辑部不需要该文件,否则可能影响审稿流程。勾选表示不附带此PDF,不勾选则会正常生成并提交该评审文件。

ZhangJiqun&191cm&85kg 2215

[C#] 一步一步教你自定义控件——01,TrackBar

[C#] 一步一步教你自定义控件——01,TrackBar 一、前言 技术没有先进落后之分,只有合不合适。 WinForm有着非常多的优点,在使用WinForm久了之后,难免会觉得WinForm自带的某些控件外观上有些许朴素、或者功能上有些不如意,自然而然便想去美化这些控件,或者给控件添加一些额外功能,而这便是自定义控件的意义所在。 自定义控件的难度并不大,但是却处在一个比较尴尬的位置: 1,一般的教材不会讲——因为还是有难度的,而且一般用不上; 2,而网上或书上所找到的自定义控件相关知识教程里,大多都是给

weixin_47312141的博客 2715

【离线OCR】微信离线实现图片OCR文本和表格识别

基于微信本地OCR引擎(由最新版微信自动安装)。通过Python对其官方调用逻辑进行完整翻译和封装,使开发者可以用简单的API调用其强大的OCR功能。

专注于医院数据分析技术与系统开发的创作与分享。 2625

智能运营模型的建设与运用实践

一项运营活动的全流程,主要包含客群挖掘与筛选、产品与权益选择、触点与活动选择、运营策略调优等关键环节,涉及客群管理、活动管理、权益管理、触达管理、智能调控等系统支撑需求,如今工商银行已开展与其相对应的推荐模型、分析模型等的研发与实践。自2023年9月该模型被知客运营平台吸收并上线以来,已累计有远程银行中心、吉林分行、重庆分行等30余家分行或机构使用,赋能融e借、积存金、结售汇、基金、理财、存款等12种场景,产生营销客户清单达千万人次,有力促进了保守型理财、天天盈、添益快线、寿险等产品的销售。

银行信息系统应用架构详解 850

Android自定义进度条控件---向高级进阶

效果展示 讲了这么多期了,大家多少应该明白自定义控件的套路了,如果还不明白,请把我的前五讲仔细复习一下,里面每一步讲的比较仔细,废话不多说,直接上码 源码分析 熟记于心的“五步走”法 第一步:创建自定义控件类 (继承于View) 第二步: 创建自定义属性 在这里,我们就不分析需要哪些自定义属性了,直接给大家上自定义属性文件,大家现在应该具备理解能力了 <?xml version="1.0" encoding="utf-8"?> <resources&gt..

我想月薪过万的博客 2589

解决微信小程序长页面滚动到底部点击底部的输入框后输入框漂浮且页面滚动到顶部

一、问题描述 项目中有一个长页面上部展示部分信息下部为信息录入,页面长度为三屏幕(不同手机屏幕大小略有差异),当滚动到第二屏或者第三屏去填写信息时点击输入框后输入框漂浮起来了并且页面向上滚动了一段距离,回到了第一屏中展示的内容。效果如图。 滚动到第二屏,证件号输入。 点击输入框 可以看到证件号输入框漂浮了起来并且页面滚动到了第一屏展示的内容。 注意:小程序是2018年上线,在2020年4月份之前该页面从未出现过这种现象。推测:微信的后续更新中对微信小程序基础库进行了重构,导致点击输入框后页

仰望星空的代码 3261

自定义控件实现整个过程,从零到有!

前言:自定义控件这技术已经被技术大牛写的很明白了,可我相信还是有好多人当自己实现时还是一头雾水,现在我们来一起学习到底如何才能学会自定义控件! 自定义控件大多都会说三步走,1.onDraw();2.onMeasure();3.onLayout();,当然这是没错的,可大多都忽略了一点,技术大牛们的基础在那摆着,这样当然无可厚非,可他们却忽略了一些人(包括我)所所欠缺的眼界问题。 在这三步的基础...

y841349476的博客 578

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android UI进阶之自定义组合控件

好久没写博客了。实在是忙不过来,不过再不总结总结真的不行了。慢慢来吧,有好多需要去总结的,博客里还是记录ui方面的。 今天和大家分享下组合控件的使用。很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当

notice501的专栏 2万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

自定义UI控件

http://www.92coding.com/blog/index.php/archives/143.html# http://my.oschina.net/wangjunhe/blog/99764 http://blog.youkuaiyun.com/wangkuifeng0118/article/details/7097733

Abel Joo 尘归尘,土归土。 1549

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android开发 自定义控件,Android开发之自定义控件用法详解

本文实例讲述了Android开发之自定义控件用法。分享给大家供大家参考,具体如下:今天和大家分享下组合控件的使用。很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便的一个方法。今天就来介绍下如何使用组合控件,将通过两个实例来介绍。第一个实现一个带图片和文字的按钮,如图所示:整个过程...

weixin_42464697的博客 457

Android 自定义控件

编辑器加载中... Android自定义控件 2011-08-24 8:08 @ noTice501 今天和大家分享下组合控件的使用。很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便的一个方法。今天就来介绍下如何使用组合控件,将通过两个实例来介绍。 第一个实现一个带图片和文字的按

移动开发砖家-扫地僧 241

用java代码自定义控件_android - 自定义(组合)控件 + 自定义控件外观

1. reference:参考某一资源ID。(1)属性定义:(2)属性使用:android:layout_width = "42dip"android:layout_height = "42dip"android:background= "@drawable/图片ID"/>2. color:颜色值。(1)属性定义:(2)属性使用:android:layout_width = "42dip"...

weixin_42116791的博客 772

android UI进阶之自定义组合控件之一

很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便的一个方法。今天就来介绍下如何使用组合控件,将通过一个实例来介绍。 实现一个带图片和文字的按钮,如图所示: 整个过程可以分四步走。第一步,定义一个layout,实现按钮内部的布局。代码如下: <LinearLay

sada09的专栏 956

Android自定义控件系列五:自定义绚丽水波纹效果

今天我们来利用Android自定义控件实现一个比较有趣的效果:滑动水波纹。先来看看最终效果图: 图一 效果还是很炫的;饭要一口口吃,路要一步步走,这里我们将整个过程分成几步来实现 一、实现单击出现水波纹单圈效果: 图二 照例来说,还是一个自定义控件,这里我们直接让这个控件撑满整个屏幕(对自定义控件不熟悉的可以参看我之前的一篇文章:And

第四维空间的专栏 3801
上一篇: 搭建Android项目:AS+GitHub+aar+maven(GitHub上的)
下一篇: Android VectorDrawable -->SVG
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值