Android-自定义View的使用_activity使用自定义view-程序员宅基地

技术标签: 自定义View  android  Android  

Android所有的控件都继承至View,所以我们可以通过继承View来实现自己想要的控件,具体代码如下:

1,创建自定义View 类

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class CustomView extends View {
    
    /*
    画笔,用来绘制View
     */
    private Paint p = new Paint();

    /**
     * 此构造方法用于代码生成自定义View实例
     * @param context
     */
    public CustomView(Context context) {
        super(context);
    }

    /**
     * 此构造方法用于XML文件生成自定义View实例
     * @param context
     * @param attrs
     */
    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 重写onDraw方法即可实现自定义的View效果
     * @param canvas
     */
    @Override
    protected void onDraw(Canvas canvas) {
        /*
        画一个图片
         */
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
        /*
        100,100是图片所在的位置,可自定义
        */
        canvas.drawBitmap(bitmap,100,100,p);
    }

    /**
     * 重写此方法可以监听点击事件
     * @param l
     */
    @Override
    public void setOnClickListener(OnClickListener l) {
        super.setOnClickListener(l);
    }
}

2,布局文件中添加自定义View 的效果

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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:orientation="vertical"
    android:paddingTop="@dimen/activity_vertical_margin">


    <githan.cn.customview.CustomView
        android:id="@+id/custom_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

3,MainActivity中获取自定义View实例

package githan.cn.customview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    
    private CustomView customView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*
        找到自定义的View
        */
        customView = (CustomView) findViewById(R.id.custom_view);
        /*
        设置View的监听事件
        */
        customView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "onclick", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

完成这三步之后你的自定义View就可以正常显示啦,上面的例子使用自定义View画了一个图标,如下图所示
这里写图片描述

关于Paint和Canvas的使用可以阅读以下文章:
http://www.jianshu.com/p/c29d3f3b7112

如果希望自定义View能够动起来,可以通过Thread线程改变View的x, y坐标,然后调用postInvalidate()方法通知View重绘即可,这里不在叙述。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/githan/article/details/52920319

智能推荐

数字后端基本概念介绍——方向-程序员宅基地

文章浏览阅读1.4k次。今天要介绍的数字后端基本概念是方向的表示方法。人生在世,最重要的是方向感。那在数字后端中,我们是如何去表征各个单元的方向的呢?首先N,S,W,E就是大家熟悉的North,..._数字pr的n方向

cenos7安装python3.8和pip3最全过程_在centos7中调用python3.8后怎使用对应的pip-程序员宅基地

文章浏览阅读8.5k次。1,打开服务器的一个文件夹cd /usr/local/src2,使用wget从官网下载安装包到此文件夹在终端下输入命令:wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz3,解压安装包tar -zxvf Python-3.6.8.tgz4,进入解压的文件夹cd Python-3.6.85,编译安..._在centos7中调用python3.8后怎使用对应的pip

Java中IO流-18-flush和close方法的区别_flush close-程序员宅基地

文章浏览阅读1.1w次,点赞16次,收藏42次。 本篇来学习一个小的知识点,flush方法和close方法的区别。前面我们介绍了和使用了close方法,知道是用来关闭流的操作,但是并没有介绍flush方法,字面意思的刷新的意思。下面我们来先看看一个例子,然后引出flush方法。1.如果不关闭流执行代码package io;import java.io.BufferedInputStream;import java.io.B..._flush close

Pandas —— merge( )合并_pandas merge on多个key-程序员宅基地

文章浏览阅读2.7w次。多对一的合并操作on参数指明连接键In [5]: df1=pd.DataFrame({'key':['b','b','a','a','b','a','c'],'data1':range(7)})In [6]: df2=pd.DataFrame({'key':['a','b','d'],'data2':range(3)})In [7]: df1Out[7]: da..._pandas merge on多个key

OpenWrt 4G路由器检测上网,然后开启 WIFI的脚本_wifi路由器脚本-程序员宅基地

文章浏览阅读1.3k次。OpenWrt 4G路由器检测上网,然后开启 WIFI的脚本MT7620A 4G的路由器刷了OpenWrt系统,为了实现4G在线开启WIFI 功能,否则关闭WIFI,首先在系统设置当中默认关闭WIFI功能,接下来建立一个Shell脚本,如下:#!/bin/bash#此脚本用于检测能否上网,是则开启WIFI功能,否则关闭。#建议用定时任务执行此脚本,如每分钟执行一次,也可修改此脚本用于死循环..._wifi路由器脚本

MFC程序崩溃的友好处理-程序员宅基地

文章浏览阅读69次。软件总存在这样或者那样的bug。虽然测试员已经在很努力的寻找问题,程序员也在汗流浃背的除虫,但是总会有一些情况被遗漏或者不可预测,比如用户的硬件环境、网络状况、操作系统差异等等,不一而足。而导致的结果则是弹出下面这样一个让用户摸不着头脑又恼火的提示,然后崩溃掉,令程序员尴尬不已。而在一些成熟的软件产品中,程序崩溃时我们看到的却是另外一番画面,比如QQ:又比如迅雷:..._mfc程序出现 appcrash

随便推点

从T7模型中取训练参数_而 vgg_normalised.t7 转化不了-程序员宅基地

文章浏览阅读4.4k次。上一章中,我们已经取出层名,层名和层名之间,是存放参数的空间,这样相当于已经给模型分了层。我们只要在层间搜索参数就可以了。第2步:搜索参数以卷积层为例:if(startsWith(TorchClassName,"nn.SpatialConvolution")){ const char *findstr[] = { "name", //名称 "dW", "dH", ..._而 vgg_normalised.t7 转化不了

重新认识程序员的「三观」-程序员宅基地

文章浏览阅读138次。在物理界和数学界,我们经常会听到一句话,叫做这个公式好美,这个论证方式完美无缺。网上有很多谈程序员规划的文章,有很多的是从能力角度来阐述。比如初级程序员、中级程序员、高级程序员、技术总监等等,还有一些事从工作经验方面来阐述,比如工作的 1~2 年,3~5 年,5 年以上等等。这篇文章尝试以「三观」的角度更加清晰简单的阐述程序员的职业生涯。欢迎大家留言评论。这三观指的是微观层面、中观层面和宏观..._程序员的三观狭隘

Linux 系统上 C 程序的编译与调试(make、gdb)_linux c/c++ cmake release 保存调试信息-程序员宅基地

文章浏览阅读557次。文章目录一、Linux 系统上 C 程序的编译二、make && makefile文件三、gdb调试3.1 Debug 版本和 Release 版本3.2 单进程、单线程基础调试命令Linux系统上 C 程序的编译与调试需要用到gcc,这里就不详细介绍gcc的安装,程序编译链接过程在下面的链接中。详情请点击↓程序编译链接过程提示:以下是本篇文章正文内容,下面案例可供参考一、Linux 系统上 C 程序的编译C程序的编译需要四部:预编译、编译、汇编、链接其分布命令如下:$ g_linux c/c++ cmake release 保存调试信息

Caused by: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "list")_cause: org.apache.ibatis.ognl.ognlexception: sourc-程序员宅基地

文章浏览阅读3.1k次。1、错误描述2017-10-08 23:58:06,672 ERROR [core.interceptor.ExceptionResolverCustom] (http-apr-8686-exec-4:) nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'pd.l_cause: org.apache.ibatis.ognl.ognlexception: source is null for getproperty(

SVN操作 -- TortoiseSVN中的Excel文件比较_svn如何查看excel不同之处-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏4次。SVN操作 -- TortoiseSVN中的Excel文件比较转载:https://blog.csdn.net/ccpat/article/details/50725774在使用TortoiseSVN时,经常需要在提交前比较本地修改的文件和版本库上的文件之间的差异。TortoiseSVN自带了一个比较工具TortoiseMerge,不过这个比较工具只能比较文本文件,不能比较二进制文件,对Exc..._svn如何查看excel不同之处

进程,协程,线程的概念与区别_请描述进程,线程和协程的概念与区别-程序员宅基地

文章浏览阅读138次。进程:电脑运行的程序,CPU资源分配的最小单位协程:程序员写的程序,程序之间的切换由用户自行处理,节省了CPU的调度时间线程:一个进程下可以有多个线程,CPU调度执行的最小单位协程属于线程,线程属于进程进程间切换消化资源>线程间切换>协程间函数切换协程中的函数切换属于用户级别的操作,进程与线程的切换属于系统级别的切换,所有会更节约性能..._请描述进程,线程和协程的概念与区别

推荐文章

热门文章

相关标签