android 绘图、自定义组件

2023-05-16

我们在开发当中很多时候都需要自定义组件,通过自定义组件,可以随心所欲定制酷炫的效果。下面将演示自定义绘图组件。我们要绘制一个红色的线条。

1.建立工程文件,名为TouchDemo。

2.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<org.touch.cn.MyPaintView 
android:id="@+id/myView"
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" />
</LinearLayout>

3.核心代码

MainActivity.java如下:

package org.touch.cn;


import android.app.Activity;
import android.os.Bundle;


public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
    } 
}

MyPaintView.java如下:

package org.touch.cn;


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


import android.app.ListActivity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;


public class MyPaintView  extends View{
private List<Point> allpoint = new ArrayList<Point>();//保存所以的操作坐标
public MyPaintView(Context context, AttributeSet attrs) {//接收context,同时接收属性集合。
super(context, attrs);//调用父类的构造
super.setOnTouchListener(new OnTouchListenerimpl());
}
private class OnTouchListenerimpl implements OnTouchListener{


@Override
public boolean onTouch(View v, MotionEvent event) {
Point p = new Point((int)event.getX(),(int)event.getY());//将坐标保存在Point类
if(event.getAction()==MotionEvent.ACTION_DOWN){ //用户按下
MyPaintView.this.allpoint=new ArrayList<Point>();//重绘
MyPaintView.this.allpoint.add(p);//保存坐标点

}else if(event.getAction()==MotionEvent.ACTION_MOVE){//用户移动
MyPaintView.this.allpoint.add(p);//记录坐标点
MyPaintView.this.postInvalidate();//重绘图形
}else if(event.getAction()==MotionEvent.ACTION_UP){//用户松开
MyPaintView.this.allpoint.add(p);//记录坐标点
MyPaintView.this.postInvalidate();//重绘图形


}

return true; //表示下面的操作不在执行了。
}

}
@Override
protected void onDraw(Canvas canvas) { //进行绘图
Paint paint = new Paint();//依靠此类开始画线
paint.setColor(Color.RED);
if(MyPaintView.this.allpoint.size()>0)//有坐标点保存的时候开始进行绘图
{
Iterator<Point> iterator = MyPaintView.this.allpoint.iterator();
Point first=null;
Point last=null;
while(iterator.hasNext()){
if(first==null)
{
first= (Point)iterator.next();//取出坐标
}else {
if(last!=null){//前一阶段已经完成
first = last;//重新开始下一阶段
}
last=(Point)iterator.next();//结果点坐标
canvas.drawLine(first.x, first.y, last.x, last.y, paint);
}
}
}
}

}

4.运行效果


5。奉上源码:  ===========》http://download.csdn.net/detail/gsg8709/4144454

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 绘图、自定义组件 的相关文章

  • jquery-mobile 加载到 android WebView 中

    我无法将 jquerymobile 装饰的网页加载到 Android WebView 中 考虑 jquery 移动演示站点 http jquerymobile com demos 1 0a4 1 http jquerymobile com
  • Android Paint:如何获得“喷枪”效果?

    我正在关注 API 演示中的 FingerPaint 演示 我需要获得 喷枪 效果 从某种意义上说 当我在同一个点上绘制时 它会变得越来越暗 请看图片 正如你所看到的 中心更暗 因为我不止一次在同一个地方涂上油漆 请问 如果绘制多次 如何获
  • chrome 检查器,远程调试在我的移动应用程序上不再正常工作

    我使用 Cordova Ionic 构建了一个渐进式 Web 应用程序 三年来的大部分时间里 我一直在使用开发工具来排除故障并分析我的应用程序的内部工作原理 然而 在过去的几周里 我认为自从 Chrome 更新到 v70 以来 开发工具无法
  • android 网格视图从右到左放置项目

    我正在开发一个 Android 应用程序阿拉伯文版本 在其中一个界面中 我有 gridView 因此 要以正确的顺序显示项目 我必须从右到左显示 GridView 中的项目 当然是从上到下 为此 我尝试在 GridView 中添加这些属性
  • 有没有办法有一个屏蔽数字输入字段?

    我正在 Android 上创建一个 HTML5 应用程序 对于这个特定场景 我们有一个用于信用卡安全代码的输入字段 我们希望强制输入字段仅包含数字并被屏蔽 我没有运气搜索这个特定的案例 从我自己研究 尝试中可以看出 这不能纯粹通过 HTML
  • 使用 iOS 分布式应用程序时 Google Cloud Messaging 显示“notRegistered”

    我在 iOS 应用程序上实现了 GCM 服务 我使用 PHP 在服务器上发送 GCM 当应用程序由开发配置文件签名时 它可以完美运行 也就是说 当应用程序使用 GCM 配置注册自身时 它始终返回一个正常运行的设备令牌 我可以使用令牌向设备发
  • 如何将 ThreeJS 与 PhoneGap 一起使用?

    这个探索是非常自我描述的 我已经用一个简单的 3D 立方体进行了测试 它在浏览器中运行良好 但只在模拟器中显示空白页面 有人说 Threejs 不能与 PhoneGap 一起使用 但也有人说他们使用过并且工作正常 在 Android 中 您
  • __stack_chk_fail_local 和 -fno-stack-protector - 如何让它工作?

    Update 我刚刚发现问题出在我的项目 libxml2 中包含的预构建库上 它是在启用堆栈保护的情况下构建的 因此依赖于 stack chk fail local方法 我现在已经重建了该库 fno stack protector也是 一切
  • overridePendingTransition 显示第二个活动的速度太快

    我有 2 个活动 我想在两个活动之间创建一个动画过渡 以便两个活动的视图向上滑动 就好像第二个活动正在向上推动第一个活动一样 在我的第一个活动中我使用 Intent iSecondActivity new Intent FirstActiv
  • 尝试使用 Facebook ID 获取 Facebook 图像时获取空位图

    这是我正在使用的代码 String imageURL Bitmap bitmap null imageURL http graph facebook com fbID picture type try bitmap BitmapFactor
  • 出现软键盘时布局未向上推

    I have designed layout by taking the reference from this https stackoverflow com questions 16411056 how to adjust layout
  • Android studio 找不到 Theme.AppCompat.Light.DarkActionBar [重复]

    这个问题在这里已经有答案了 我已经导入了一个Android Studio项目来自Github into Android Studio 虽然我的build gradle有dependencies dependencies compile fi
  • 从前台服务的活动中释放内存

    我有一个带有前台服务和一项活动的应用程序 该服务可以在启动时自行启动 也可以从 Activity 中启动 我注意到当服务在启动时自行启动时 内存使用量约为 3MB 一旦我打开该 Activity 内存使用量就会跃升至约 9mB 一旦 Act
  • 未捕获的引用错误:cordova 未定义

    这是我的 HelloPlugin js 文件 var HelloPlugin callNativeFunction function success fail resultType return cordova exec success f
  • Android 10 通知彩色操作按钮

    I m trying to color the buttons Action in Notification like this So far this is what i m achieved so far 下面是我正在使用的代码 通知服
  • 如何找出每个包含的库的最低 api 级别

    我的项目中包含了很多库 Android Studio 2 0 Preview 4 我想找出它们每个的最低 Android SDK 级别 是否可以不用谷歌搜索每个图书馆的信息 如果您有源形式的库 例如 作为项目中的库模块 请查看其清单 如果您
  • android 填充包含片段的布局

    问题是什么 我如何膨胀包含片段的布局 我不知道错误消息的含义 请帮我 谢谢 错误信息 09 01 18 44 58 698 E AndroidRuntime 20617 Caused by java lang IllegalArgument
  • Android Webview:无法调用确定的可见性() - 从未见过 pid 的连接

    我有一个 Android Webview 当我单击链接下载文件 pdf 图像等 时 我收到一条错误消息 Error message Cannot call determinedVisibility never saw a connectio
  • Volley 在第一次调用方法时返回 null

    我正在尝试使用 volley 从服务器检索数据 但是当我第一次调用此方法时 我收到服务器的响应 但该方法返回 null 如果我第二次调用它 我会得到最后的响应 public String retrieveDataFromServer Str
  • Android:防止嗅探(例如使用 CharlesProxy)SSL 流量

    我使用 Charles 检查将我的应用程序发送到 HTTPS 的数据 我在手机上安装了 Charles CA 证书 因此我能够解密每个 SSL 流量 但我发现一些应用程序无法看到 SSL 流量 我如何将这种行为实现到我自己的应用程序中 有了

随机推荐

  • C语言对栈的操作

    span class hljs preprocessor include lt stdio h gt span span class hljs preprocessor include lt stdlib h gt span span cl
  • Godot实用代码1000例

    关于 这是 Godot实用代码1000例 的CSDN博客版本 xff08 之前是PPT版本 xff09 xff0c 将收录笔者自己探索和学习的一些简单Godot编程案例 文章目录 关于原版开篇的废话适合哪些人群建议前置知识 基础的移动 旋转
  • Godot官网新闻翻译 - 2015年

    本文是 Godot官网新闻翻译 系列的第1篇 xff0c 该系列旨在翻译和汇总Godot官网所发布的所有新闻 让更多英文不好的童鞋可以领悟官方新闻中的重要信息和真谛 官网新闻地址 xff1a https godotengine org ne
  • 一文简单了解并构建DockerFile

    GreatSQL社区原创内容未经授权不得随意使用 xff0c 转载请联系小编并注明来源 GreatSQL是MySQL的国产分支版本 xff0c 使用上与MySQL一致 作者 xff1a 蟹黄瓜子文章来源 xff1a GreatSQL社区投稿
  • 更新sudo apt source提示sources.list拼写错误的解决方法

    如果sudo apt uodate 更新失败 xff0c 多半是源的问题 xff0c 这是轻的症状 xff0c 根据提示 xff0c 把产生错误错误源去掉就行了 xff0c 但是情况较复杂怎么办 xff1f 如果有一天 xff0c 你在终端
  • 静态库和动态链接库的安装(Windows环境)

    库的安装 xff1a freeglut为例 1 在SourceForge下载freeglut库 xff0c 其中包括include src文件夹和CMakesLists txt freeglut download SourceForge n
  • C++ share_ptr 循环引用问题浅析

    share ptr指针涉及到循环引用问题会因为share ptr指针对应的use count 无法清0 xff0c 导致内存泄露 xff0c 直接上例子 xff1a class S B class S A public shared ptr
  • 树莓派raspberry pi更换国内镜像

    有时候使用sudo apt get 和pip install 安装软件和一些库的时候下载速度简直是龟速如下图 xff1a xff0c 是因为在系统默认状态下 xff0c 安装软件会选择从国外的服务器上下载软件 默认地址是http raspb
  • 将SQL Server的任意记录转换为JSON格式(JQGRID) -- 支持SQL 2005

    从SQL 2008开始 xff0c SQL Sever已经支持JSON数据 xff0c SQL 2016已经对JSON数据的处理支持非常完善 对于SQL 2016以上版本的用户 xff0c 可以直接调用原生方法 xff0c 效率更高 因客户
  • gradle安装

    Gradle是一个主要用于Java项目的通用构建工具 它结合了Ant和Maven的最佳功能 与使用XML进行脚本编写的前辈不同 xff0c Gradle使用Groovy xff0c 这是一种动态的 xff0c 面向对象的Java平台编程语言
  • 树列表控件CTreeListCtrl类

    翻译来源 xff1a https www codeproject com Articles 2913 A Tree List Control 作者 xff1a TigerX 下载源文件 102 Kb 下载演示文件 54 6 Kb 介绍 这是
  • 2019xupt-acm校赛 题解(C.给你一个666)by出题组tongtong

    重现赛链接 2019 ACM ICPC Xi 39 an University of Posts amp Telecommunications School Contest 前面的话 有幸参与2019XUPT ACM校赛出题和裁判工作 过程
  • 【安装】在Windows下安装Debian(双系统)

    安装 一 前期准备二 Rufus制作启动盘三 修改BIOS四 以U盘启动安装Debian五 设置分区 一 前期准备 1 一个至少8G的U盘 2 U盘引导制作工具 我用的Rufus 链接 3 Debian的iso镜像 我用的清华镜像 点进链接
  • Swift 四种实现单例的方式

    单例模式 单例模式是设计模式中最简单的一种 xff0c 甚至有些模式大师都不称其为模式 xff0c 称其为一种实现技巧 xff0c 因为设计模式讲究对象之间的关系的抽象 xff0c 而单例模式只有自己一个对象 当你只需要一个实例的时候需要使
  • python之字符串切片为列表

    函数名说明A replace old new count 将字符串A里的old替换为new xff0c 替换次数为counta join A 将字符串序列A之间插入字符aA split sep xff0c count 将字符串A切片输出为列
  • 用python实现最简单简单的计算器

    直接上代码 xff1a 密码是123 过程 体验 收获及自我评价 xff0c 本人在活动的具体工作可以输入1000字 import os 让解释器停住 xff0c 引用os模块 print 34 欢迎使用计算程序 34 print 34 请
  • Android 一键分享功能

    之前在做项目时遇到这么个需求 xff0c 就是用户点击Menu或者一个按钮可以把文字分享到各大微博例如新浪微博 腾讯 人人 开心 校内等 现在我给大家演示一下 xff08 一 xff09 先建一个工程文件ShareDemo xff08 二
  • android listview单击事件

    今天我们来学习下listview 单击事件 xff0c 这在开发中是经常用的组件之一 1 新建一个项目 xff0c 名为ListViewDemo 2 布置布局文件main xml lt xml version 61 34 1 0 34 en
  • android 焦点事件

    今天介绍下android中的焦点事件 xff0c 之前在项目有用到过 这块不是很难 xff0c 大家跟着过一遍吧 xff0c 用到的时候直接把我下面这段代码拷贝过去就ok了 1 建一个工程 xff0c 名为TestFocus 2 在布局文件
  • android 绘图、自定义组件

    我们在开发当中很多时候都需要自定义组件 xff0c 通过自定义组件 xff0c 可以随心所欲定制酷炫的效果 下面将演示自定义绘图组件 我们要绘制一个红色的线条 1 建立工程文件 xff0c 名为TouchDemo 2 布局文件 lt xml