`
wangleyiang
  • 浏览: 220766 次
社区版块
存档分类
最新评论

让Surface中绘制的内容响应用户的交互(状态变化)

阅读更多

被绘制的内容响应用户的交互,简单的看就是绘制内容的状态在用户操作时发生了变化。

对于在SurfaceView中绘制的内容,如果我们希望文字可以水平移动,看看我们可以做些什么来实现这样的效果?首先,为了让例子简单,我们从XML文件中的Button接收用户的操作。然后在Activity中让自定义的View做我们所希望的状态变化,前提是获得自定义View的引用和为其添加操作接口。最后,在MyView中改变文字的X坐标来实现文字位置的改变,需要刷新(动态或静态),本例选择动态刷新。

1、布局文件

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="左" />

    <Button
        android:id="@+id/button_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="右" />

    <com.test.MyView
        android:id="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout

说明:

 

  1. 为了简化,我们从XML文件中放置按钮,接收用户的操作事件。
  2. 给MyView指定ID,为了后面可以获得其引用。

2、在Activity中添加用户点击按钮操作

 

public class MainActivity extends Activity implements OnClickListener {
	
	private Button btnLeft;
	private Button btnRight;
	
	private MyView myView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		
		setContentView(R.layout.activity_main);
		
		myView = (MyView) findViewById(R.id.my_view);
		
		btnLeft = (Button) findViewById(R.id.button_left);
		btnRight = (Button) findViewById(R.id.button_right);
		
		btnLeft.setOnClickListener(this);
		btnRight.setOnClickListener(this);
		
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button_left:
			myView.left();
			break;
		case R.id.button_right:
			myView.right();
			break;
		default:
			break;
		}
	}

}

 说明:

 

  1. 左移文字:myView.left();
  2. 右移文字:myView.right();

3、给MyView添加行为和属性

public class MyView extends SurfaceView implements Callback, Runnable {

	private Paint mPaint;
	private SurfaceHolder mSurfaceHolder;
	private Thread mThread;
	
	private float x = 10;
	
	private void initial() {
		
		mPaint = new Paint();  
		mPaint.setAntiAlias(true);
        this.setKeepScreenOn(true);
        mPaint.setColor(Color.RED);  
        
        mThread = new Thread(this);
        
        mSurfaceHolder = getHolder();
        mSurfaceHolder.addCallback(this);
        
	}
	
	public MyView(Context context) {
		super(context);
		initial();
	}
	
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initial();
	}
	
	public void left() {
		x = x - 5;
	}
	
	public void right() {
		x = x + 5;
	}
	
	private void draw() {
		
		Canvas mCanvas = null;
		try {
			mCanvas = mSurfaceHolder.lockCanvas();
			if (mCanvas != null) {
				mCanvas.drawColor(Color.WHITE);
				mCanvas.drawText("绘制文字", x, 20, mPaint);
				mCanvas.drawCircle(35, 50, 20, mPaint);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (mCanvas != null) {
				mSurfaceHolder.unlockCanvasAndPost(mCanvas);
			}
		}
		
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		mThread.start();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		System.out.println("www:surfaceDestroyed");
	}

	@Override
	public void run() {
		while (true) {
			draw();
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

 说明:

  1. 添加文字x坐标位置的属性:private float x = 10;
  2. 添加行为,左移:left(); 右移:right();
  3. 在run方法里面修改逻辑为每隔0.1秒刷新绘制一次;

效果如下:

 

希望对你有所帮助!:)

 

 

 

  • 大小: 20.8 KB
分享到:
评论

相关推荐

    bezier-surface-master.rar

    5. **用户交互**:描述中提到可以动态调控方向、颜色等,这意味着代码中会有事件监听器来响应用户的输入,比如鼠标点击或拖动,实时更新控制点的位置,或者改变曲面的属性如颜色、透明度等。 6. **性能优化**:由于...

    android glsurface example

    6. **交互性**:GLSurfaceView可以通过设置触摸监听器或其他输入事件处理器,使其能够响应用户的触摸操作,从而实现交互式3D场景。 7. **优化**:在处理大量对象或复杂3D场景时,可能需要考虑优化策略,如顶点缓存...

    关于用于与图形用户界面交互的方法和设备的介绍说明.rar

    反馈是指系统对用户操作应有即时的响应,让用户知道他们的操作已被接受。简单性和易学性要求设计简洁明了,避免过多复杂的设置。而容错性则是指即使用户误操作,系统也能尽可能地减少错误的影响。 GUI的实现涉及多...

    B样条曲面绘制

    B样条曲面绘制是计算机图形学中的一个重要概念,它涉及到数学、计算机编程以及图形用户界面设计等多个领域。在Java开发环境中,利用NetBeans编辑器进行B样条曲面的实现,可以为开发者提供一个直观且强大的工具来创建...

    Android系统Surface机制的SurfaceFlinger服务的线程模型分析.doc

    这个线程会等待消息队列中的消息,当有新的渲染请求(如应用程序更新视图)或硬件帧缓冲区状态变化时,它会被唤醒执行相应的操作,如绘制和合成屏幕内容。 3. **控制台事件监控线程**:在初始化硬件帧缓冲区时,...

    BasicGLSurfaceViewActivity.rar_surface

    4. **处理用户交互**:通过重写`GLSurfaceView`的触摸事件处理,可以响应用户的输入并相应地更新渲染。 对于初学者来说,理解`GLSurfaceView`的工作原理和如何在Android中集成OpenGL是至关重要的,这包括了解OpenGL...

    windows编程,3设计-08输入和交互

    凝视交互是一种基于眼动追踪的技术,可以让用户通过注视屏幕上的特定位置来进行交互。 #### 4.2 隐私 在使用凝视交互时,需要注意保护用户的隐私信息。 #### 4.3 设置 设置凝视交互时,需要确保硬件和软件环境都...

    surfaceview 打标签修改版

    然而,描述中提到的“基于SurfaceView的绘制,实现标签功能”可能是指在SurfaceView上动态绘制具有文字或图片内容的标签,这些标签可能作为信息提示、用户交互元素或者界面装饰存在。 实现这个功能需要以下步骤: ...

    星巴克星星效果

    6. **交互设计**:为了让效果更具吸引力,可以考虑添加用户交互,比如让用户触摸屏幕控制星星的移动速度或方向,或者根据时间、位置等因素改变星星的闪烁频率。 7. **资源管理**:如果使用了位图资源,记得在不再...

    SurfaceView

    开发者可以通过SurfaceHolder监听Surface的状态变化,如创建、改变或销毁。SurfaceHolder提供了方法如`addCallback()`用于添加回调,以便在Surface发生变化时进行相应的操作,如初始化绘图环境。 2. **Surface创建...

    Android应用源码之MyLiveWallPaper.zip

    同时,通过SurfaceHolder的setCallback()方法设置回调,监听Surface的状态变化,确保在Surface可用时进行绘制。 4. **触摸事件处理**: Engine类可以通过重写onTouchEvent()方法来处理用户的触摸事件。根据业务需求...

    android动态壁纸

    1. ** Wallpaper Engine**:通过` WallpaperService onCreateEngine()`方法创建,它是壁纸的运行环境,负责处理壁纸的绘制和用户交互。 2. **Canvas**:在`WallpaperService Engine.onDraw()`方法中,我们可以获取...

    基于vs2013Windowsurface pro4 触屏操作

    在开发基于Visual Studio 2013的项目时,针对Windows Surface Pro 4这样的设备进行触屏操作的优化是一项关键...在实际开发过程中,不断测试和优化是确保软件质量的关键,特别是对于多设备兼容性和用户交互体验的考量。

    SurFaceView组合图形移动,适用于游戏

    - **低延迟更新**:由于不在主线程中绘制,SurfaceView能快速响应变化,提供低延迟的图形更新,适合动态内容显示。 2. **组合图形**: 在游戏中,往往需要将多个图形组合在一起形成复杂的游戏场景。SurfaceView...

    surfaceview实现抽奖转盘

    在SurfaceHolder接口的帮助下,我们可以监听Surface的状态变化,比如创建、改变或销毁,以便在合适的时机进行绘图。 创建抽奖转盘的第一步是设计转盘的布局。这可能包括多个扇区,每个扇区代表不同的奖项。每个扇区...

    4-4(SurfaceView游戏框架).7z

    - **Handler/Looper机制**:用于在渲染线程和UI线程之间传递消息,更新游戏状态或者响应用户输入。 - **Canvas绘图**:在SurfaceView的Surface上,开发者通过Canvas进行图形绘制,实现游戏场景的渲染。 - **Thread...

    一个涂鸦还有画矩形 圆形的小Demo_android涂鸦绘画源码.zip

    8. **OnTouchListener**:这是Android中处理触摸事件的接口,通过实现`onTouch()`方法,开发者可以对用户的触摸动作做出响应,比如开始绘制、停止绘制等。 9. **XML布局文件**:在资源文件夹下的res/layout目录中,...

    Android使用SurfaceView实现墨迹天气的风车效果

    5. **响应用户交互**:为了让用户能够控制风车的转动,可以添加触摸事件监听器,根据用户的滑动或点击事件改变风车的旋转速度或方向。 6. **优化性能**:为了提高性能,避免不必要的重绘,可以使用`setWillNotDraw...

    android转盘圆周切换菜单 仿ios

    在Android开发中,有时我们需要为应用添加独特且吸引用户的交互元素。"android转盘圆周切换菜单 仿ios"是一个项目,目标是实现一个类似iOS风格的圆形转盘菜单,让用户能够通过触摸屏幕或者按钮来切换不同的选项。...

Global site tag (gtag.js) - Google Analytics