Android自定义view(一):制作一个最最最简单的自定义view

时间:2022-09-25 15:14:06

转载:https://blog.csdn.net/wsyizmao/article/details/78491422

浅谈安卓自定义view(一):制作一个最最最简单的自定义view

对于安卓程序员来说,自定义view简直很重要,毕竟有很多功能,譬如圆形头像这些,用单纯的原生非常难以实现,而用自定义view,简直分分钟。

在这里,我尝试用最简单方式跟初学者说一下如何自定义一个自己的view~

首先,最简单最简单的自定义view,有多简单?简单到没有逻辑,没有任何自带属性,只是简单展示,

譬如,我制作一个圆形图片。。。

一共只需要两步,

第一步,创建你的自定义类,让它继承View类,并重写构造方法。

第二步,重写ondraw()方法。

比如,我创建了这个自定义类名字叫做circleImageView,如下图所示:

Android自定义view(一):制作一个最最最简单的自定义view

注意,这里有两个默认的构造器方法,circleImageView(Context context)和circleImageView(Context context,AttributeSet arrts)

其中circleImageView(Context context)这个方法是你动态new的时候调用的,而circleImageView(Context context,AttributeSet arrts)这个方法是你在xml文件中调用才会调用这个方法。如下图,直接将标签定义为类名便可以了:

Android自定义view(一):制作一个最最最简单的自定义view

然后第二步,重写ondraw()方法!

在这里简单说一下,ondraw(),顾名思义就是画画方法,在自定义组件时候,其实内部可以简单分为三个步骤,也就是三大方法,onMeasure,onLayout,ondraw,这些方法在自定义组件中依次运行,先onMeasure获得组件大小,再onLayout知道组件布局位置,最后ondraw将组件渲染画出来,但是其实在自定义组件中onMeasure和onLayout不是必须重写的,所以在这里我先不说,后面再讲,就说这个ondraw方法,这个是必须实现的方法。

在上面的构造器方法中,我已经在组件初始化的时候便将要显示的图片初始化伟bitmap了

Android自定义view(一):制作一个最最最简单的自定义view

嗯,就是上面那个方法

接下来我们要做的就是将这个bitmap截成一个圆形,在这里我写了一个圆形方法,如下图:

Android自定义view(一):制作一个最最最简单的自定义view

好啦,画圆方法写好啦,最后就是在ondraw里面调用画画方法就好了,如下图

Android自定义view(一):制作一个最最最简单的自定义view

这样一个自定义组件就写好啦,完整代码如下图

package com.example.administrator.testmyidea.myTextView;

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.view.View;
import com.example.administrator.testmyidea.R; public class circleImageView extends View{
private Paint mPaint;
private Bitmap imageBitmap;
private float circleRadio; public circleImageView(Context context) {
super(context);
mPaint=new Paint(); } public circleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint=new Paint();
imageBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.touxiang);
} @Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(getCircle(imageBitmap),0,0,mPaint);
} //将bitmap转换成圆形bitmap
public Bitmap getCircle(Bitmap bitmap){
//circleRadio圆形图片的半径
float circleRadio=bitmap.getWidth()/2;
//创建一张新的bitmap,跟传入图片一样宽的正方形bitmap,
Bitmap b=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getWidth(), Bitmap.Config.ARGB_8888);
//初始化画布,并将刚才创建的bitmap给这画布,让画布画在这bitmap上面
Canvas canvas=new Canvas(b);
//初始化画笔
Paint p=new Paint();
//在画布中画一个等宽的圆
canvas.drawCircle(circleRadio,circleRadio,circleRadio,p);
//设置画笔属性,让画笔只在哪圆圈中画画,关于画笔属性,可以百度一下,很多,但是非常有用
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap,0,0,p);
return b;
} }

在xml里面代码是这样的

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:luo="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.testmyidea.MainActivity">
<com.example.administrator.testmyidea.myTextView.circleImageView
android:layout_centerInParent="true"
android:layout_width="150dp"
android:layout_height="150dp"/> </RelativeLayout>

诺~自定义的圆形imageview出来啦。

也可在代码动态设置图片,也可以在xml里面加入图片地址。

Android自定义view(一):制作一个最最最简单的自定义view的更多相关文章

  1. 制作一个可以滑动操作的 Table View Cell

    本文转载至 https://github.com/nixzhu/dev-blog Apple 通过 iOS 7 的邮件(Mail)应用介绍了一种新的用户界面方案——向左滑动以显示一个有着多个操作的菜单 ...

  2. 【Android初级】如何实现一个有动画效果的自定义下拉菜单

    我们在购物APP里面设置收货地址时,都会有让我们选择省份及城市的下拉菜单项.今天我将使用Android原生的 Spinner 控件来实现一个自定义的下拉菜单功能,并配上一个透明渐变动画效果. 要实现的 ...

  3. &lbrack;Android Pro&rsqb; service中显示一个dialog 或者通过windowmanage显示view

    转载: http://blog.csdn.net/huxueyan521/article/details/8954844 通过windowmananger来在窗口上添加view的时候,需要设置aler ...

  4. Android中使用shape制作一个旋转的progressbar

    public class ZNtestResActivity extends Activity { @Override public void onCreate(Bundle savedInstanc ...

  5. View Controller Programming Guide for iOS---&lpar;五&rpar;---Resource Management in View Controllers

    Resource Management in View Controllers View controllers are an essential part of managing your app’ ...

  6. Android一个简单的自定义对话框制作

    布局文件 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android= ...

  7. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...

  8. Android学习笔记(十二)——实战:制作一个聊天界面

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...

  9. 自定义View&lpar;三&rpar;--实现一个简单地流式布局

    Android中的流式布局也就是常说的瀑布流很是常见,不仅在很多项目中都能见到,而且面试中也有很多面试官问道,那么什么是流式布局呢?简单来说就是如果当前行的剩余宽度不足以摆放下一个控件的时候,则自动将 ...

随机推荐

  1. unity3d Light Probe Group图解超详细使用方法

    原创文章如需转载请注明:转载自http://blog.csdn.net/qq617119142 第一步,创建一个Panel 和 三个 cube,搭建成如下图形状 第二步,创建2个点光源,一个为绿灯,一 ...

  2. PCL—低层次视觉—点云分割(基于凹凸性)

    1.图像分割的两条思路 场景分割时机器视觉中的重要任务,尤其对家庭机器人而言,优秀的场景分割算法是实现复杂功能的基础.但是大家搞了几十年也还没搞定——不是我说的,是接下来要介绍的这篇论文说的.图像分割 ...

  3. 命令行方式运行yii2程序

    测试环境,yii 2.0.3版本 web访问方式,控制器放在controllers目录下 ,浏览器访问如下地址 http://127.0.0.1/index.php?r=[controller-nam ...

  4. 基于C&plus;&plus;11的线程池&comma;简洁且可以带任意多的参数

    咳咳.C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool) ...

  5. Java基础第一天(标识符、变量)

    一.标识符 Java对各种变量.类.方法命名时的字符序列. 凡自己可以起名字的地方都叫标识符. 标识符特点: 1.26个英文字母大小写,0~9,$,_ 组成. 2.数字不可以做开头. 3.不可以使用关 ...

  6. Echart遇到的问题:tooltip提示框大小异常

    将Echart图表放到项目中,发现当鼠标放到柱状图上时,提示框显示大小超出了div的大小. 官方的文档对于tooltip的说明也没有指出:如何修改大小. 那么tooltip是什么呢? fn+f12打开 ...

  7. ZOJ 3846 GCD Reduce&sol;&sol;水啊水啊水啊水

    GCD Reduce Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge You are given a sequ ...

  8. Asp&period;net core 跨域设置

    验证环境: dotnet core 2.1/Asp.net core2.1 一.作用域在中间件层  配置的方式是在startup.cs文件Configure(IApplicationBuilder a ...

  9. java中Date与DateFormat的格式输出

    一.DateFormat java.text.DateFormat 使用 getDateInstance 来获取该国家/地区的标准日期格式.另外还提供了一些其他静态工厂方法.使用 getTimeIns ...

  10. 【Appium】Appium工作原理

    参考:http://www.cnblogs.com/zhjsll/p/5698878.html 原作者写的很好,所以直接放在这里. 一.什么是Appium Appium是一个开源.跨平台的测试框架,可 ...