`
japankn
  • 浏览: 213259 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

OnTouchListener 绘图

 
阅读更多

在View类中除了定义了若干接口外,还有一些自己扩充的监听事件,而触摸事件也是View类定义的监听事件。

OnTouchListener触摸事件主要用到绘图操作、游戏等方面。

OnTouchListener是指用户触摸到屏幕后产生的一些形式,而当用户从屏幕上划过时候,可以通过OnTouchListener事件得到用户当前的坐标,OnTouchListener接口定义如下

public Interface View.OnTouchListener(){

public abstract boolean onTouch(View v,MotionEvent event);

}

 事例1.

在main.xml中进行布局(记住这里的TextView宽高是占满)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- 显示当前用户触摸的坐标, -->
    <TextView
        android:id="@+id/info"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="fdsaf"
        />

</LinearLayout>


2.在Activity中写代码完成触摸得到用户的坐标

package com.qn.touch;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;

public class OnTouchActivity extends Activity {
    /** Called when the activity is first created. */
 private TextView info=null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        info=(TextView)super.findViewById(R.id.info);
        info.setOnTouchListener(new OnTouchListenerIml());
    }
   
    private class OnTouchListenerIml implements OnTouchListener{

  public boolean onTouch(View v, MotionEvent event) {
   System.out.println("zenm ");
   info.setText(" X= " +event.getX()+ " Y= "+event.getY());//设置文本
   return false;//执行完后还可以执行其他操作
  }
     
     
    }
}


结果



 


事例二

绘图

如果要绘图必须从新定义一个属于自己的新组件继承android.View.View

如果要定义组件的话一定要考虑好构造方法这个问题,

另外靠基本格式是不行的人,如果要绘图的话,就要保持多个坐标下来。所以 坐标可以通过Point类进行包装(Point类专门用来保持我们的x坐标、y坐标)

1.在main.xml中不需要写入其他的控件而是我们自己通过继承android.view.View类,所定义的

如下是自定义实现view的类和main.xml内的布局

package com.qn.mypain;

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

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.util.MonthDisplayHelper;
import android.view.MotionEvent;
import android.view.View;

public class MainActivity extends View {
 private List<Point> allpoint=new ArrayList<Point>();//保存所有的操作坐标,只要有一个坐标触发就通过allpoint集合保存
 public MainActivity(Context context, AttributeSet attrs) {//构造方法作用接收Context,同时接收属性集合
  super(context, attrs);//调用父类的构造方法
  super.setOnTouchListener(new OnTouchListenerImpl());//相当于定义了一个触摸事件
 }
 private class OnTouchListenerImpl implements OnTouchListener{

  
//  现在触摸事件只是保存了所有的坐标点,如果想要这些内容显示,则需要复写View类的一个方法
//  OnDraw()表示重绘(绘图);
  public boolean onTouch(View v, MotionEvent event) {
   Point point=new Point((int)event.getX(),(int)event.getY());//将我们的坐标点保存到Point类中
   if(event.getAction()==MotionEvent.ACTION_DOWN){//用户按下 表示从新保存点
    MainActivity.this.allpoint=new ArrayList<Point>();//从新绘制一张图
    MainActivity.this.allpoint.add(point);
   }else if(event.getAction()==MotionEvent.ACTION_UP){//用户松开
    MainActivity.this.allpoint.add(point);//记录坐标点
    MainActivity.this.postInvalidate();//移动一点画一点移一点画一点(重新绘图形)
    
   }else if(event.getAction()==MotionEvent.ACTION_MOVE){//用户移动
    MainActivity.this.allpoint.add(point);//记录坐标点
    MainActivity.this.postInvalidate();//移动一点画一点移一点画一点(重新绘图形)
   }
   
   return true;//要改为true表示下面不在执行了
  }
  
  
 }
// 由于这个类没有太多复杂的操作,所以直接将这个类配置到布局管理器中即可(这是一个新的组件类)
 @Override
 protected void onDraw(Canvas canvas) {//进行绘图
  Paint paint=new Paint();//依靠此类开始画线
  paint.setColor(Color.RED);//定义图的颜色
  if(MainActivity.this.allpoint.size()>1){//现有坐标点保存的时候进行开始绘图
   Iterator<Point> iter=MainActivity.this.allpoint.iterator();//固定操作 通过点绘图
   Point first=null;
   Point last=null;
   while(iter.hasNext()){
    if(first==null){
     first=(Point)iter.next();//取出坐标
    }else{
     if(last!=null){//前一阶段完成
      first=last;//重新开始下一阶段
     }
     last=(Point)iter.next();//结束点坐标
     canvas.drawLine(first.x, first.y, last.x, last.y, paint);
     
    }
   }
  }
  
 }

}




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- 新的组件类(主要用于画图)而后Activity不需要其他二外的操作 就是调用布局管理器-->
    <com.qn.mypain.MainActivity
        android:id="@+id/paintView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />

</LinearLayout>



2.在Activity中只需要调用main.xml布局就行


package com.qn.mypain;

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

public class MyTouch extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
}
}



结果



  
  • 大小: 11.7 KB
  • 大小: 23.9 KB
分享到:
评论

相关推荐

    drawableontouchlistener:用于 Android SDK 10+ 的复合可绘制对象的 OnTouchListener

    在Android开发中,`Drawable`和`OnTouchListener`是两个重要的组件。`Drawable`是Android图形库中的一个接口,用于创建各种图形,如颜色、形状、位图等,并且可以与视图(View)结合,为视图提供背景或者装饰。而`...

    android之简易绘图板

    5. **OnTouchListener**:注册OnTouchListener接口,处理用户与屏幕的交互,捕获触控事件以驱动绘图。 6. **颜色选择器和画笔设置**:允许用户选择不同的颜色、线宽和填充模式,通过改变Paint对象的属性实现。 7. ...

    安卓绘图,标绘

    双击事件的处理可以通过`OnTouchListener`和`OnClickListener`实现,检测到双击后,根据标记列表删除对应的标注,并刷新视图。 4. 程序解耦:描述中提到了代码结构实现了界面与功能实现的解耦。这是软件设计中的一...

    android绘图 自定义组件

    - onTouchListener:添加到View上,监听触摸事件,根据MotionEvent进行响应,如在TouchDemo中,可能实现拖动、缩放、旋转等操作。 - 触摸事件分发:ViewGroup通过onInterceptTouchEvent决定是否拦截触摸事件,然后...

    安卓手绘图片处理画板相关-android手绘操作demo和经典绘图源码Pretty-Painter-master.zip

    OnTouchListener接口用于监听这些事件,当用户触摸屏幕时,可以通过重写onTouch()方法获取触摸坐标,实现绘图功能。 5. **保存与加载绘图**:为了保存用户的画作,可以将最终的Bitmap以PNG或JPEG格式保存到设备存储...

    markers,演示如何使用android touch api绘制压敏图形的示例应用程序。.zip

    在Android平台上,开发一款能够利用触控API进行压敏绘图的应用程序是一项有趣且具有挑战性的任务。"Markers"是一个开源项目,它提供了一个演示如何实现这一功能的示例应用程序。这个项目对于学习和理解Android触摸...

    Android 画图工具源码.zip源码资源下载

    3. **MotionEvent与OnTouchListener**: 在Android中,处理用户触摸事件通常需要实现View的OnTouchListener接口,监听MotionEvent。当用户在屏幕上进行滑动、点击等操作时,系统会发送MotionEvent对象,开发者可以...

    手绘操作demo和经典绘图源码Pretty-Painter-master.zip

    开发者需要创建MotionEvent的适配器,例如OnTouchListener,来捕获和解析用户的触摸动作。 6. **Java编程基础**:整个项目基于Java语言,因此需要掌握Java的基本语法,包括类、对象、方法、异常处理等。 7. **...

    绘图(Drawing)画布功能

    要实现"绘制圆"的功能,你需要创建一个OnTouchListener监听按钮事件。当用户点击“绘制”按钮时,生成一个随机颜色,并使用Canvas的drawCircle()方法在Bitmap上绘制一个圆。这个方法需要圆心的坐标(x,y),圆的...

    Android draw自动绘画功能.rar

    - `OnTouchListener`接口用于监听视图上的触摸事件,通过重写`onTouch()`方法,我们可以获取到用户的触摸轨迹,并在`Canvas`上绘制。 3. **Path对象**: - `Path`类用于创建和存储路径,它可以包含直线、曲线等...

    IregularView.rar

    Android提供了多种绘图工具,如Paint用于设置颜色、线条样式等,Path用于构建复杂的路径,以及RectF用于绘制矩形。例如,我们可以通过Path的addPath()、addRect()、addCircle()等方法组合出复杂的不规则形状。 点击...

    Android-拼图小游戏

    综上所述,开发"Android-拼图小游戏"涉及到的技术点包括:Android应用程序开发、Java或Kotlin编程、自定义View、Canvas绘图、Bitmap处理、手势检测、事件监听、UI设计以及简单的游戏逻辑实现。通过掌握这些技能,...

    Android-TClock类似时钟的自定义控件包含事件监听

    首先,`TClock`控件的实现基于Android的Canvas绘图机制。Canvas是Android图形系统的一部分,用于在屏幕上绘制各种图形,包括线条、矩形、圆形等。开发者需要重写`onDraw()`方法,在这里绘制时钟的指针和刻度。时钟的...

    Android_GWES

    最终,这些绘图操作会通过底层的API调用完成,经过Skia/OpenGL引擎处理后,由SurfaceFlinger组件渲染到屏幕的framebuffer上。 #### 三、总结 Android GWES中的View System是构建复杂用户界面的基础,它不仅涉及UI...

    实现android的图表

    可以实现`OnTouchListener`接口,处理`ACTION_DOWN`, `ACTION_MOVE`, 和 `ACTION_UP`事件,根据手势更新视图的显示。 为了提高性能和用户体验,我们还可以实现缓存机制。可以使用`Bitmap`对象作为绘图缓存,先在`...

    android开发画板

    Android中的事件处理主要通过OnClickListener、OnTouchListener等接口实现。对于画板,通常需要监听用户的触摸事件,比如手指的滑动,来实时更新画布上的绘图。`MotionEvent`类提供了获取用户触摸动作的方法,如`...

    android 画板 sdk

    canvasView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 处理触摸事件,传递给CanvasView进行绘图 return canvasView.onTouchEvent...

    Android高级应用源码-android 之旋转罗盘 风车 开发 Android 随手指旋转图片.zip

    - **OnTouchListener**:另外,也可以直接在视图上设置`OnTouchListener`,监听触摸事件,通过计算手指移动的角度来更新图片的旋转状态。 4. **性能优化** - **硬件加速**:开启硬件加速可以提高图形渲染性能,但...

    安卓Andriod源码——自定义组件实现可滑动的ToggleButton的功能.zip

    private View.OnTouchListener touchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: ...

    安卓Android源码——风车效果源码.zip

    要使风车能响应用户的交互,开发者需要添加`OnClickListener`或`OnTouchListener`到风车视图上,然后在回调方法中处理用户输入,更新风车的旋转状态。 7. **性能优化** 实现复杂的动画时,需要注意性能问题。使用...

Global site tag (gtag.js) - Google Analytics