2014-11-6Android学习------在手机上用鼠标绘图的处理---贝塞尔曲线(一)

news/2024/7/8 12:44:41

写一篇文章很辛苦啊!!!

转载请注明,联系请邮件nlp30508@qq.com


我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的源码 百度搜就知道很多下载的地方  网上源码的名字叫:android 仿真翻页效果.zip我的博客写的比较乱,如果本篇文章没有看懂,

请先看上篇文章,地址:http://blog.csdn.net/u014737138/article/details/40866447

为了学习贝塞尔曲线 前面我们必须要先掌握几个知识点  :Canvas Bitmap Path Paint

一:Bitmap

位图文件(Bitmap),扩展名可以是.bmp或者.dib。
位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。
例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/8=3072KB

andorid 中的位图类:Bitmap  学习地址:http://blog.csdn.net/u014737138/article/details/40897073

二.关于Paint Path Canvas

学习地址:http://blog.csdn.net/u014737138/article/details/40897575

三.如何利用鼠标绘图

为了学习贝塞尔曲线,我们必须先搞清楚画笔是怎么做,所以就有了这篇文章的存在,

1.定义必须的变量:位图 画布 画笔(画图的画笔,画线的画笔) 路径

private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mBitmapPaint;
private Paint mPaint;

2.定义手指的坐标

private float mX, mY; 

3.定义一个常量表示移动的距离达到多少才画

private static final float TOUCH_TOLERANCE = 4;  

4.构造函数中初始化这些变量

注意到我们当前的类是继承View的,也就是说必须重载onDraw()函数

mBitmap = Bitmap.createBitmap(480, 800, Bitmap.Config.RGB_565);//创造位图
mCanvas = new Canvas(mBitmap);//利用位图创造画图
mPath = new Path();//创造一个路径
mBitmapPaint = new Paint(Paint.DITHER_FLAG);//创造一个绘图画笔

//下面的是画笔的处理

mPaint = new Paint();
mPaint.setAntiAlias(true);//设置抗锯齿
mPaint.setDither(true);// 设置 抖动处理,也即是递色,让图片变得更加清晰
mPaint.setColor(0xFF00FF00);//设置画笔的颜色
mPaint.setStyle(Paint.Style.STROKE);//设置画笔的风格
mPaint.setStrokeJoin(Paint.Join.ROUND);//设置平滑效果
mPaint.setStrokeCap(Paint.Cap.ROUND);//设置画笔的样式,依据画笔的风格STYLE而定
mPaint.setStrokeWidth(10);//设置画笔粗细度

5.重载onDraw()函数:

@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);  //利用画图画笔在画布上首先绘制位图
        canvas.drawPath(mPath, mPaint);  //接下来在画布上画线条

}

6.接下来是触摸监听事务的处理,也就是手指动的时候就画

   @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        float x = event.getX();  //得到手指的x坐标
        float y = event.getY();  //得到手指的y坐标
          
        switch (event.getAction()) {  
            case MotionEvent.ACTION_DOWN:  //按下事件
                touch_start(x, y);  //开始画
                invalidate();  //刷新视图,UI进程负责调用这个函数,当前的类是继承View的
                break;  
            case MotionEvent.ACTION_MOVE:  //按下并拖动
                touch_move(x, y);  //移动
                invalidate();  //刷新视图
                break;  
            case MotionEvent.ACTION_UP:  //手指松开,
                touch_up();  //松开
                invalidate();  //刷新
                break;  
        }  
        return true;  
    }     

7.各个监听事件的处理:

//开始画

      private void touch_start(float x, float y) {  
        mPath.reset();  //首先清空所有的线条
        mPath.moveTo(x, y);  //然后手指开始滑动,第一个点,也即是起始点,就是箭头起始在哪个位置
        mX = x;  //手指的X坐标
        mY = y;  //手指的Y坐标
    }  
    private void touch_move(float x, float y) {  //手指在拖动
        float dx = Math.abs(x - mX);  //获取移动中的X坐标变化的差值
        float dy = Math.abs(y - mY);  //获取移动中的Y坐标变化的差值
         
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {  
              //如果该次移动的距离跟上次的相比超过4就画线,否则不做处理,就是不执行画线处理
            mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);//二次方贝塞尔曲线  
            mX = x;  //记录下当前的手指x坐标
            mY = y;  //记录下当前的手指Y坐标
        }  
    }  
    private void touch_up() {  //手指松开
        mPath.lineTo(mX, mY);  //最后的坐标点,
        mCanvas.drawPath(mPath, mPaint);  //在画布上画出这条线路
        mPath.reset();  //松开之后需要清空下画笔
    }  

void reset()
Clear any lines and curves from the path, making it empty.
void quadTo(float x1, float y1, float x2, float y2)
Add a quadratic bezier from the last point, approaching control point (x1,y1), and ending at (x2,y2).
从最后一个点添加一个二次贝塞尔,接近控制点(X1,Y1),并且在(X2,Y2)结束

将上面的代码放入一个类中,类名:TouchView

启动代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(new TouchView(this)); 
}

配置清单文件:

        <activity
            android:name=".TouchScreenActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

不需要布局文件什么之类的,就两个类可以测试这个代码

运行效果图:


这既是贝塞尔曲线的一个画笔效果。还有翻页效果,请继续关注我的下篇文章



http://www.niftyadmin.cn/n/1974368.html

相关文章

JPA数据操作汇总,常用的数据操作方法都在这了

前言 写博客总结&#xff0c;最近公司进新人&#xff0c;写了个内部文档顺便整理了一下jap的数据操作demo 正文 第一种方式&#xff1a; 根据客户名称查询客户&#xff0c;使用jpql的形式查询&#xff0c;配置jpql语句&#xff0c;使用的Query注解 Query(value"from …

nginx将svn请求转发到apache实现svn http请求

需要安装apache libapache2-svn模块&#xff0c;nginx&#xff0c;svn。安装过程略过。 记录比较重要几点&#xff08;不按先后&#xff09;&#xff1a; 安装apache的svn模块 sudo apt-get install libapache2-svn apahce的svn模块,通过他实现svn权限等问题。 apt-get …

树形结构的遍历过程全遍历

前言 树形结构是项目开发中常常用到的一种结构&#xff0c;也是一种经典的数据结构&#xff0c;比如说常见的二叉树&#xff0c;红黑树等&#xff0c;今天要说的不是基础的数据结构&#xff0c;是业务中用到的树形数据结构。 正文 先来看看业务是什么吧&#xff01; 业务 如…

2014-11-6Android学习------Android图像处理之Bitmap类

Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息&#xff0c;进行图像剪切、旋转、缩放等操作&#xff0c;并可以指定格式保存图像文件。本文从应用的角度&#xff0c;着重介绍怎么用Bitmap来实现这些功能。 一、Bitmap的生成 1.1 BitmapFactory dec…

Android如何绘制视图,解释了为何onMeasure有时要调用多次

2019独角兽企业重金招聘Python工程师标准>>> 原文地址&#xff1a;How Android Draws Views 当Activity获取焦点的时候&#xff0c;它就需要绘制布局。Android框架会处理绘制过程&#xff0c;但这个Activity必须提供它布局树的根节点。 绘制过程是从布局的根节点开始…

安利一个画图的网站

前言 大家画流程图&#xff0c;架构图都用什么呢&#xff1f;之前画图用的不同的软件安装到电脑上&#xff0c;比如微软的Visio 画甘特图各种图也都能画&#xff0c;但是不免费不香。然后有用了ProcessOn这个也是挺好用的&#xff0c;就是免费的图有点少&#xff0c;后来通过多…

2014-11-6Android学习------Android Paint和Color类、Canvas类的常用属性

要绘图&#xff0c;首先得调整画笔&#xff0c;待画笔调整好之后&#xff0c;再将图像绘制到画布上&#xff0c;这样才可以显示在手机屏幕上。 graphics中包括了Canvas&#xff08;画布&#xff09;、Paint&#xff08;画笔&#xff09;、Color&#xff08;颜色&#xff09;、B…

14.4.9 Innodb通用表空间

2019独角兽企业重金招聘Python工程师标准>>> 一. 通用表空间简介 通用表空间是innodb表空间新类型&#xff0c;5.7.6引入 通用表空间提供以下功能&#xff1a; 类似系统表空间&#xff0c;是共享表空间&#xff0c;能存储多个表的数据相比独立表空间&#xff0c;通用…