你的位置:首页 > 操作系统

[操作系统]自定义控件——随着手指移动的小球

  一个关于自定义控件的小Demo,随着手指移动的小球。

  先看下效果图:

  

 

  实现代码如下:

  1.自定义控件类

 1 package com.dc.customview.view; 2  3 import android.content.Context; 4 import android.graphics.Canvas; 5 import android.graphics.Color; 6 import android.graphics.Paint; 7 import android.util.AttributeSet; 8 import android.view.MotionEvent; 9 import android.view.View;10 import android.view.WindowManager;11 12 public class DrawCircle extends View {13   //圆的初始位置14   private int x = 100;15   private int y = 100;16   Context context;17   18   /**19    * 有style资源文件时调用20    * @param context21    * @param attrs22    * @param defStyle23   */24   public DrawCircle(Context context, AttributeSet attrs, int defStyle) {25     super(context, attrs, defStyle);26     this.context = context;27   }28   /**29    * 30    * @param context31    * @param attrs32   */33   public DrawCircle(Context context, AttributeSet attrs) {34     super(context, attrs);35     this.context = context;36   }37   /**38    * java代码创建时调用39    * @param context40   */41   public DrawCircle(Context context) {42     super(context);43     this.context = context;44   }45   46   @Override47   protected void onDraw(Canvas canvas) {48     super.onDraw(canvas);49     // 画笔50     Paint paint = new Paint();51     paint.setColor(Color.RED);52 53     //绘制圆  54     //cx :圆心的x坐标55     //cy :圆心的y坐标  56     //radius :圆的半径57     //paint :画笔58     canvas.drawCircle(x, y, 20, paint);59   }60 61   @Override62   public boolean onTouchEvent(MotionEvent event) {63     switch (event.getAction()) {64       case MotionEvent.ACTION_DOWN:65 66       case MotionEvent.ACTION_MOVE:67 68       case MotionEvent.ACTION_UP:69         // 获取当前触摸点的x,y坐标70           71           x = (int) event.getX();72           y = (int) event.getY();73         74 75         break;76     }77     //获取屏幕宽高78     WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);79     int width = manager.getDefaultDisplay().getWidth();80     int heigh = manager.getDefaultDisplay().getHeight();81     82     //重新绘制圆 ,控制小球不会被移出屏幕83     if(x>=20 && y>=20 && x<=width-20 && y<=heigh-90){84       invalidate();85     }86       // 自己处理触摸事件87       return true;88     }89   90 }

  2.引用自定义控件

  第一种:

 1 <RelativeLayout  2    3   android:layout_width="match_parent" 4   android:layout_height="match_parent"  5   android:id="@+id/rl"> 6    7  <!-- 自定义控件的全类名 --> 8  <com.dc.customview.view.DrawCircle 9     android:id="@+id/circle"10     android:layout_width="wrap_content"11     android:layout_height="wrap_content" >12   </com.dc.customview.view.DrawCircle> 13 14 </RelativeLayout>

 

  第二种:代码中引用

  

 1 package com.dc.customview; 2  3 import com.dc.customview.view.DrawCircle; 4  5 import android.os.Bundle; 6 import android.app.Activity; 7 import android.view.Menu; 8 import android.view.View; 9 import android.widget.RelativeLayout;10 11 public class MainActivity extends Activity {12 13   @Override14   protected void onCreate(Bundle savedInstanceState) {15     super.onCreate(savedInstanceState);16     setContentView(R.layout.activity_main);17     18     //获取容器19     RelativeLayout container = (RelativeLayout) findViewById(R.id.rl);20     21     //创建自定义控件22     DrawCircle circle = new DrawCircle(this);23     24     //添加到容器25     container.addView(circle);26   }27 28 }

  

  以上,将Demo运行到模拟器或手机上,即可实现一个红色的圆,随着手指触摸移动而移动的效果。