-
Android 自定义View (一)
2014-04-21 15:20:04很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义View上面花一些功夫,多写一些文章。先总结下自定义View的步骤: 1、自定义View的属性 2、...转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24252901
很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义View上面花一些功夫,多写一些文章。先总结下自定义View的步骤:
1、自定义View的属性
2、在View的构造方法中获得我们自定义的属性
[ 3、重写onMesure ]
4、重写onDraw
我把3用[]标出了,所以说3不一定是必须的,当然了大部分情况下还是需要重写的。
1、自定义View的属性,首先在res/values/ 下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。
我们定义了字体,字体颜色,字体大小3个属性,format是值该属性的取值类型:<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="titleText" format="string" /> <attr name="titleTextColor" format="color" /> <attr name="titleTextSize" format="dimension" /> <declare-styleable name="CustomTitleView"> <attr name="titleText" /> <attr name="titleTextColor" /> <attr name="titleTextSize" /> </declare-styleable> </resources>
一共有:string,color,demension,integer,enum,reference,float,boolean,fraction,flag;不清楚的可以google一把。
然后在布局中声明我们的自定义View
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.customview01.view.CustomTitleView android:layout_width="200dp" android:layout_height="100dp" custom:titleText="3712" custom:titleTextColor="#ff0000" custom:titleTextSize="40sp" /> </RelativeLayout>
一定要引入 xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01"我们的命名空间,后面的包路径指的是项目的package2、在View的构造方法中,获得我们的自定义的样式
/** * 文本 */ private String mTitleText; /** * 文本的颜色 */ private int mTitleTextColor; /** * 文本的大小 */ private int mTitleTextSize; /** * 绘制时控制文本绘制的范围 */ private Rect mBound; private Paint mPaint; public CustomTitleView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomTitleView(Context context) { this(context, null); } /** * 获得我自定义的样式属性 * * @param context * @param attrs * @param defStyle */ public CustomTitleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); /** * 获得我们所定义的自定义样式属性 */ TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyle, 0); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.CustomTitleView_titleText: mTitleText = a.getString(attr); break; case R.styleable.CustomTitleView_titleTextColor: // 默认颜色设置为黑色 mTitleTextColor = a.getColor(attr, Color.BLACK); break; case R.styleable.CustomTitleView_titleTextSize: // 默认设置为16sp,TypeValue也可以把sp转化为px mTitleTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics())); break; } } a.recycle(); /** * 获得绘制文本的宽和高 */ mPaint = new Paint(); mPaint.setTextSize(mTitleTextSize); // mPaint.setColor(mTitleTextColor); mBound = new Rect(); mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound); }
我们重写了3个构造方法,默认的布局文件调用的是两个参数的构造方法,所以记得让所有的构造调用我们的三个参数的构造,我们在三个参数的构造中获得自定义属性。3、我们重写onDraw,onMesure调用系统提供的:
此时的效果是:@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onDraw(Canvas canvas) { mPaint.setColor(Color.YELLOW); canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint); mPaint.setColor(mTitleTextColor); canvas.drawText(mTitleText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint); }
是不是觉得还不错,基本已经实现了自定义View。但是此时如果我们把布局文件的宽和高写成wrap_content,会发现效果并不是我们的预期:
系统帮我们测量的高度和宽度都是MATCH_PARNET,当我们设置明确的宽度和高度时,系统帮我们测量的结果就是我们设置的结果,当我们设置为WRAP_CONTENT,或者MATCH_PARENT系统帮我们测量的结果就是MATCH_PARENT的长度。
所以,当设置了WRAP_CONTENT时,我们需要自己进行测量,即重写onMesure方法”:
重写之前先了解MeasureSpec的specMode,一共三种类型:
EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
UNSPECIFIED:表示子布局想要多大就多大,很少使用
下面是我们重写onMeasure代码:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height ; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { mPaint.setTextSize(mTitleTextSize); mPaint.getTextBounds(mTitle, 0, mTitle.length(), mBounds); float textWidth = mBounds.width(); int desired = (int) (getPaddingLeft() + textWidth + getPaddingRight()); width = desired; } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { mPaint.setTextSize(mTitleTextSize); mPaint.getTextBounds(mTitle, 0, mTitle.length(), mBounds); float textHeight = mBounds.height(); int desired = (int) (getPaddingTop() + textHeight + getPaddingBottom()); height = desired; } setMeasuredDimension(width, height); }
现在我们修改下布局文件:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.customview01.view.CustomTitleView android:layout_width="wrap_content" android:layout_height="wrap_content" custom:titleText="3712" android:padding="10dp" custom:titleTextColor="#ff0000" android:layout_centerInParent="true" custom:titleTextSize="40sp" /> </RelativeLayout>
现在的效果是:完全复合我们的预期,现在我们可以对高度、宽度进行随便的设置了,基本可以满足我们的需求。
当然了,这样下来我们这个自定义View与TextView相比岂不是没什么优势,所有我们觉得给自定义View添加一个事件:
在构造中添加:
this.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mTitleText = randomText(); postInvalidate(); } });
private String randomText() { Random random = new Random(); Set<Integer> set = new HashSet<Integer>(); while (set.size() < 4) { int randomInt = random.nextInt(10); set.add(randomInt); } StringBuffer sb = new StringBuffer(); for (Integer i : set) { sb.append("" + i); } return sb.toString(); }
下面再来运行:我们添加了一个点击事件,每次让它随机生成一个4位的随机数,有兴趣的可以在onDraw中添加一点噪点,然后改写为验证码,是不是感觉很不错。
好了,各位学习的,打酱油的留个言,顶个呗~
源码点击此处下载
-
Android 自定义View
2014-08-20 23:36:00Android 自定义View在安卓开发的过程中,安卓官方自带的控件有时候往往不能满足我们的需求。这个时候我就需要自定义。下面我们就看看自定义View:
package com.example.myview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.util.AttributeSet; import android.view.View; import android.view.View.OnClickListener; public class MyView extends View implements OnClickListener{ private int a=0; private Paint paint; public MyView(Context context) { super(context); // TODO Auto-generated constructor stub } public MyView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint=new Paint();//定义一个画笔 paint.setColor(Color.RED);//给画笔设置颜色 paint.setStyle(Style.FILL);//设置画笔填充 canvas.drawCircle(100, 100, 100, paint);//画个圆 paint.setColor(Color.BLUE);//给画面设置颜色 paint.setTextSize(20);//设置字体大小 canvas.drawText("小源"+a, 100, 100, paint); setOnClickListener(this);//给View加上监听 } @Override public void onClick(View arg0) { // TODO Auto-generated method stub a++; invalidate();//重新绘制 } }
在XML中 我们要把我们自定义的控件写上如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <com.example.myview.MyView android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>
这就完成了一个非常简单的自定义View.程序路上一起努力,加油!好了,一点点在进步!最终会成为大神的!
-
android 自定义view
2016-12-21 10:22:22文章汇总: Android自定义控件三部曲文章索引 ANDROID-自定义控件-继承VIEW与VIEWGROUP的初步理解 Android 自定义View合集展开全文 -
Android 自定义View (二) 进阶
2014-04-22 11:39:25继续自定义View之旅,前面已经介绍过一个自定义View的基础的例子,Android 自定义View (一),如果你还对自定义View不了解可以去看看。今天给大家带来一个稍微复杂点的例子。 自定义View显示一张图片,下面包含图片...转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24300125
继续自定义View之旅,前面已经介绍过一个自定义View的基础的例子,Android 自定义View (一),如果你还对自定义View不了解可以去看看。今天给大家带来一个稍微复杂点的例子。
自定义View显示一张图片,下面包含图片的文本介绍,类似相片介绍什么的,不过不重要,主要是学习自定义View的用法么。
还记得上一篇讲的4个步骤么:
1、自定义View的属性
2、在View的构造方法中获得我们自定义的属性
[ 3、重写onMesure ]
4、重写onDraw直接切入正题:
1、在res/values/attr.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="titleText" format="string" /> <attr name="titleTextSize" format="dimension" /> <attr name="titleTextColor" format="color" /> <attr name="image" format="reference" /> <attr name="imageScaleType"> <enum name="fillXY" value="0" /> <enum name="center" value="1" /> </attr> <declare-styleable name="CustomImageView"> <attr name="titleText" /> <attr name="titleTextSize" /> <attr name="titleTextColor" /> <attr name="image" /> <attr name="imageScaleType" /> </declare-styleable> </resources>
2、在构造中获得我们的自定义属性:/** * 初始化所特有自定义类型 * * @param context * @param attrs * @param defStyle */ public CustomImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomImageView, defStyle, 0); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.CustomImageView_image: mImage = BitmapFactory.decodeResource(getResources(), a.getResourceId(attr, 0)); break; case R.styleable.CustomImageView_imageScaleType: mImageScale = a.getInt(attr, 0); break; case R.styleable.CustomImageView_titleText: mTitle = a.getString(attr); break; case R.styleable.CustomImageView_titleTextColor: mTextColor = a.getColor(attr, Color.BLACK); break; case R.styleable.CustomImageView_titleTextSize: mTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics())); break; } } a.recycle(); rect = new Rect(); mPaint = new Paint(); mTextBound = new Rect(); mPaint.setTextSize(mTextSize); // 计算了描绘字体需要的范围 mPaint.getTextBounds(mTitle, 0, mTitle.length(), mTextBound); }
3、重写onMeasure@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // super.onMeasure(widthMeasureSpec, heightMeasureSpec); /** * 设置宽度 */ int specMode = MeasureSpec.getMode(widthMeasureSpec); int specSize = MeasureSpec.getSize(widthMeasureSpec); if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate { Log.e("xxx", "EXACTLY"); mWidth = specSize; } else { // 由图片决定的宽 int desireByImg = getPaddingLeft() + getPaddingRight() + mImage.getWidth(); // 由字体决定的宽 int desireByTitle = getPaddingLeft() + getPaddingRight() + mTextBound.width(); if (specMode == MeasureSpec.AT_MOST)// wrap_content { int desire = Math.max(desireByImg, desireByTitle); mWidth = Math.min(desire, specSize); Log.e("xxx", "AT_MOST"); } } /*** * 设置高度 */ specMode = MeasureSpec.getMode(heightMeasureSpec); specSize = MeasureSpec.getSize(heightMeasureSpec); if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate { mHeight = specSize; } else { int desire = getPaddingTop() + getPaddingBottom() + mImage.getHeight() + mTextBound.height(); if (specMode == MeasureSpec.AT_MOST)// wrap_content { mHeight = Math.min(desire, specSize); } } setMeasuredDimension(mWidth, mHeight); }
4、重写onDraw@Override protected void onDraw(Canvas canvas) { // super.onDraw(canvas); /** * 边框 */ mPaint.setStrokeWidth(4); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.CYAN); canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint); rect.left = getPaddingLeft(); rect.right = mWidth - getPaddingRight(); rect.top = getPaddingTop(); rect.bottom = mHeight - getPaddingBottom(); mPaint.setColor(mTextColor); mPaint.setStyle(Style.FILL); /** * 当前设置的宽度小于字体需要的宽度,将字体改为xxx... */ if (mTextBound.width() > mWidth) { TextPaint paint = new TextPaint(mPaint); String msg = TextUtils.ellipsize(mTitle, paint, (float) mWidth - getPaddingLeft() - getPaddingRight(), TextUtils.TruncateAt.END).toString(); canvas.drawText(msg, getPaddingLeft(), mHeight - getPaddingBottom(), mPaint); } else { //正常情况,将字体居中 canvas.drawText(mTitle, mWidth / 2 - mTextBound.width() * 1.0f / 2, mHeight - getPaddingBottom(), mPaint); } //取消使用掉的快 rect.bottom -= mTextBound.height(); if (mImageScale == IMAGE_SCALE_FITXY) { canvas.drawBitmap(mImage, null, rect, mPaint); } else { //计算居中的矩形范围 rect.left = mWidth / 2 - mImage.getWidth() / 2; rect.right = mWidth / 2 + mImage.getWidth() / 2; rect.top = (mHeight - mTextBound.height()) / 2 - mImage.getHeight() / 2; rect.bottom = (mHeight - mTextBound.height()) / 2 + mImage.getHeight() / 2; canvas.drawBitmap(mImage, null, rect, mPaint); } }
代码,结合注释和第一篇View的使用,应该可以看懂,不明白的留言。下面我们引入我们的自定义View:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:zhy="http://schemas.android.com/apk/res/com.zhy.customview02" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.zhy.customview02.view.CustomImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:padding="10dp" zhy:image="@drawable/ic_launcher" zhy:imageScaleType="center" zhy:titleText="hello andorid ! " zhy:titleTextColor="#ff0000" zhy:titleTextSize="30sp" /> <com.zhy.customview02.view.CustomImageView android:layout_width="100dp" android:layout_height="wrap_content" android:layout_margin="10dp" android:padding="10dp" zhy:image="@drawable/ic_launcher" zhy:imageScaleType="center" zhy:titleText="helloworldwelcome" zhy:titleTextColor="#00ff00" zhy:titleTextSize="20sp" /> <com.zhy.customview02.view.CustomImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:padding="10dp" zhy:image="@drawable/lmj" zhy:imageScaleType="center" zhy:titleText="妹子~" zhy:titleTextColor="#ff0000" zhy:titleTextSize="12sp" /> </LinearLayout>
我特意让显示出现3中情况:1、字体的宽度大于图片,且View宽度设置为wrap_content
2、View宽度设置为精确值,字体的长度大于此宽度
3、图片的宽度大于字体,且View宽度设置为wrap_content
看看显示效果:
怎么样,对于这三种情况所展示的效果都还不错吧。
好了,就到这里,各位看官,没事留个言,顶一个呗~
源码点击下载
-
Android自定义View
2012-10-09 16:21:33Android自定义View需要继承View,重写构造函数、onDraw,(onMeasure)等函数。 如果自定义的View需要有自定义的属性,需要在values下建立attrs.xml。在其中定义你的属性。 在使用到自定义View的xml布局文件中需要... -
Android自定义view之围棋动画
2020-12-30 15:59:52Android自定义view之围棋动画 好久不见,最近公众号内粉丝要求上新一篇有点难度的自定义view文章,它来了!! 文章目录Android自定义view之围棋动画前言完成效果图一、pandas是什么?二、使用步骤1.引入库2.读入... -
Android 自定义View步骤
2017-09-01 11:02:06Android 实现一个简单的自定义View Android 自定义View步骤 Android 自定义View之Canvas相关方法说明 Android 自定义View实例(验证码) Android 自定义View实例(进度圆环) Android 源码分析(TextView) Android ... -
Android 自定义View之Canvas详解
2017-09-01 11:03:42Android 实现一个简单的自定义View Android 自定义View步骤 Android 自定义View之Paint详解 Android 自定义View之Canvas相关方法说明 Android 自定义View实例(验证码) Android 自定义View实例(进度圆环) Android... -
android 自定义View
2012-03-24 18:55:08哈哈,兄弟我终于自己写了一个view,不是网上那种简单的哦,还是有一定技术含量的, 我是通过学习ApiDemo(android自带的sample)里面LabelView实现的, ...自定义一个View那必须继承View, 首先 -
Android自定义View深度解析(二、深入解析自定义属性)
2016-05-21 03:53:04转载请标明出处: ...在上一篇博客《Android自定义View(一、初体验)》中我们体验了自定义控件的基本流程: 继承View,覆盖构造方法 自定义属性 重写onMeasure方法测量宽高 重写onDraw方法 -
Android 自定义 View
2011-08-30 10:31:33这几了解了一下如何自定义View 下面记录一下; 在定义View的时候,需要继承View类,并且重写onDraw(Canvas canvas)方法,如果有更多的必要可以给View添加事件,但是有些事件需要设置setFocuse为true才能使用;在... -
Android 自定义View实例之进度圆环
2017-09-04 16:08:23Android 实现一个简单的自定义View Android 自定义View步骤 Android Paint详解 Android 自定义View之Canvas相关方法说明 Android 自定义View实例之 “京东跑” Android 自定义View实例之进度圆环 Android 源码分析... -
Android 自定义View(一)
2017-05-31 13:04:12Android自定义View -
Android自定义View的实现方法,带你一步步深入了解View(四)
2014-01-23 08:32:09不知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了,回顾一下,我们一共学习了...现在前半部分的承诺已经如约兑现了,那么今天我就要来兑现后面部分的承诺,讲一讲自定义View的实现方法,同时这也是带 -
Android 自定义View实例之 “京东跑”
2017-09-01 11:23:14Android 实现一个简单的自定义View Android 自定义View步骤 Android Paint详解 Android 自定义View之Canvas相关方法说明 Android 自定义View实例之 “京东跑” Android 自定义View实例(进度圆环) Android 源码分析... -
Android自定义View-自定义Spinner
2019-11-05 14:18:12Android自定义View-自定义Spinner 在使用系统Spinner时,往往总不能跟自己主题进行颜色搭配。这里介绍一下对Spinner的样式的修改,主要是对外观和颜色的修改。 效果图: Spinner背景图片: 1. 2. 效果图中... -
Android自定义View 自定义xml属性设置
2015-04-18 16:26:51Android自定义View 自定义xml属性设置 继承View,重写构造函数、onDraw,(onMeasure)等函数。 如果自定义的View需要有自定义的属性,需要在values下建立attrs.xml。在其中定义你的属性。 在使用到自定义View... -
Android自定义View流程
2016-03-16 15:51:47做Android项目也做了好久啦,自定义控件也用了不少,有用别人现成的,也有用自己写的,现在项目已经告一段落,今天我们就来聊一聊Android自定义View流程。 Android自定义,大致分为以下几步: 1、确定自定义View所要... -
Android自定义View——自定义样式
2016-01-21 10:56:29上一节《Android自定义View——可设置形状(圆形、圆角矩形)的ImageView,抗锯齿》讲解了第一个自定义View,现在以上一节的例子讲解自定义样式的使用,方便在xml布局文件中直接设置自定义View的属性。 首先在res... -
Android自定义View之ProgressBar出场记
2016-05-01 16:49:04关于自定义View,我们前面已经有三篇文章在介绍了,如果筒子们还没阅读,建议先看一下,分别是android自定义View之钟表诞生记、android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索、android自定义View之... -
Android 自定义View手写签名
2019-07-02 19:15:37Android 自定义View:手写签名 最近项目中有个新的需求,就是要实现用户手写签名,然后展示再上传到服务器。看到效果图后,先是面对百度编程搜了一下,很多实现方法,主要就是自定义View实现的,为了记录其中的坑,... -
Android 自定义View,实现折线图
2014-06-10 22:03:04Android 自定义View,实现折线图 ,可参考博客http://blog.csdn.net/yifei1989/article/details/29891211 -
Android自定义View使用总结
2018-09-21 10:29:31Android自定义View使用总结 2016年11月29日 16:49:19 峥嵘life 阅读数:3148 标签: android widget 自定义View 更多 个人分类: Andr图形和动画 android 版权声明:本文为博主原创文章。只要评论中留言就可以... -
Android 自定义View——自定义ProgressBar
2015-09-16 22:21:01Android中给我们提供了多个样式的ProgressBar,SeekingBar,RatingBaar等进度条,但是我们这些样式都满足不了我们的要求,这时我们就可以使用自定义View来定义我们自己想要的形式的进度条。 这里讲解三种样式的... -
从此再有不愁自定义View——Android自定义view详解
2016-11-13 19:00:47更多相关资料参见:Android自定义view详解 对于我这样一个Android初级开发者来说,自定义View一直是一个遥不可及的东西,每次看到别人做的特别漂亮的控件,自己心里那个痒痒啊,可是又生性懒惰,自己不肯... -
Android自定义View(四)_自定义View的分类和流程
2016-12-22 14:53:50上一篇介绍了: Android自定义View(三)_颜色 从本篇开始,将会逐渐揭开自定义View的神秘面纱,每一篇都将比上一篇内容更加深入,利用所学的知识能够制作更加炫酷自定义View,就像在台阶上一样,每一篇都更上一层,... -
Android自定义view获取attr中自定义颜色的问题
2020-12-06 19:39:40Android自定义View在布局中设置颜色 问题描述: 以下为学弟的代码 //attrs文件 <attr name="leftcolor" format="color"/> <attr name="rightcolor" format="color"/> //Java文件代码,获取颜色 int... -
Android 自定义View——带进度条按钮
2017-06-08 18:14:35Android 自定义View——带进度条按钮 -
android 自定义view实现数字进度条
2016-12-19 12:45:36android 自定义view实现数字进度条
-
手势解锁-canvas-javascript实战
-
flutter插件调用APP页面、使用原生aar,framework库
-
数据类型转换、运算符、方法入门
-
Java无损导出及转换word文档
-
转行做IT-第5章 流程控制语句
-
算法设计之KMP算法
-
请大家看看为什么
-
随便的模电复习(2)
-
大数据Hive on MR/TEZ与hadoop的整合应用
-
Redis持久化方式有哪些?
-
PHP下载文件的代码和常见文件的http中content-type头的值(MIME类型)
-
SQL创建表为啥不显示
-
Laya 2.0 开发3D小游戏 入门教学
-
starbuck.rar
-
PTA 浙大版《C语言程序设计实验与习题指导(第3版)》题目集(编程题参考答案).zip
-
数字图书馆2.iso 中小学建设数字图书馆的一些建议,领导干部必备,分为2个盘
-
如何利用从polar上获得的睡眠和运动信息使用plotly画图展示?
-
SQLite数据库工具-01.zip
-
饮料自动售卖机1.0.vi
-
【数据分析-随到随学】Hive详解