当前位置:   article > 正文

android自定义组件-跟随手指的小球_android 自定义原子球结构图

android 自定义原子球结构图
自定义view
  1. package org.crazyit.ui;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.util.AttributeSet;
  7. import android.view.MotionEvent;
  8. import android.view.View;
  9. public class DrawView extends View
  10. {
  11. public float currentX = 40;
  12. public float currentY = 50;
  13. //public float currentX2 = 40; //离开屏幕时记录的点位置用来画直线
  14. //public float currentY2 = 50;
  15. // 定义、并创建画笔
  16. Paint p = new Paint();
  17. public DrawView(Context context) { super(context);}
  18. public DrawView(Context context , AttributeSet set) { super(context,set);}
  19. @Override
  20. public void onDraw(Canvas canvas)
  21. {
  22. super.onDraw(canvas);
  23. // 设置画笔的颜色
  24. p.setColor(Color.RED);
  25. // 绘制一个小圆(作为小球)
  26. canvas.drawCircle(currentX, currentY, 15, p);
  27. //canvas.drawLine(currentX, currentY, currentX2, currentY2, p);// 画线
  28. }
  29. // 为该组件的触碰事件重写事件处理方法
  30. @Override
  1. public boolean onTouchEvent(MotionEvent event)
  2. {
  3. // 修改currentX、currentY两个属性
  4. currentX = event.getX();
  5. currentY = event.getY();
  6. // 通知当前组件重绘自己
  7. invalidate();
  8. // 返回true表明该处理方法已经处理该事件
  9. return true;
  10. // int action = event.getAction();
  11. // switch (action)
  12. // {
  13. // case MotionEvent.ACTION_DOWN:
  14. // currentX = event.getX();
  15. // currentY = event.getY();
  16. // //invalidate();
  17. // break;
  18. // case MotionEvent.ACTION_UP:
  19. // currentX2 = event.getX();
  20. // currentY2 = event.getY();
  21. // //invalidate();
  22. // postInvalidate();
  23. // break;
  24. // }
  25. // return true;
  26. }
  27. }

注释掉代码用于画直线

invalidate();
是用来实现界面的刷新的,每次需要使用view时,使用invalidate()后才能得到更新后的界面

postInvalidate()刷新界面在该代码中效果一样。

两种刷新界面的区别:android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。


public DrawView(Context context) { super(context);}

是在new对象建立该View时调用的

public DrawView(Context context , AttributeSet set) { super(context,set);}

是在xml中声明自定义View是调用的


下面补充View类的四个构造方法

  1. public DrawView(Context context) {
  2. super(context);
  3. }
  4. public DrawView(Context context, AttributeSet attrs) {
  5. super(context, attrs);
  6. }
  7. public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
  8. super(context, attrs, defStyleAttr);
  9. }
  1. public DrawView(Context context, AttributeSet attrs, int defStyleAttr,
  2. int defStyleRes) {
  3. super(context, attrs, defStyleAttr, defStyleRes);
  4. // TODO Auto-generated constructor stub
  5. }



Activity

  1. package org.crazyit.ui;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.Menu;
  5. import android.view.MenuItem;
  6. import android.widget.LinearLayout;
  7. public class CustomViewActivity extends Activity
  8. {
  9. @Override
  10. public void onCreate(Bundle savedInstanceState)
  11. {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.main);
  14. // 获取布局文件中的LinearLayout容器
  15. LinearLayout root = (LinearLayout) findViewById(R.id.root);
  16. // 创建DrawView组件
  17. final DrawView draw = new DrawView(this);
  18. draw.setMinimumWidth(300);
  19. draw.setMinimumHeight(500);
  20. root.addView(draw);
  21. }
  22. }


  1. draw.setMinimumWidth(300);
  2. draw.setMinimumHeight(500);
使用来设置自定义组件的最小宽度、高度,此处注释掉,测试没有明显区别

布局

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".CustomViewActivity"
  6. android:id="@+id/root"
  7. android:orientation="vertical">
  8. </LinearLayout>



声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号