美文网首页
运动的小球

运动的小球

作者: 蛋蛋不哭 | 来源:发表于2016-04-27 16:23 被阅读36次

    自定义View (不应写布局)

    • Pview.java

    public class Pview extends View {
    
        private int cirx = 20, ciry = 20; // 圆心点
        private int radius = 20; // 半径
        private int rectx = 100, recty = 400;
        private int dirx, diry; // 方向0正方向 , 1反方向
        private Timer mTimer = new Timer(); // 定时器
        private int width, height;
        private Paint mPaint;
    
        //布局发生变化时的回调函数,间接回去调用onMeasure, onLayout函数重新布局 
        @Override
        protected void onSizeChanged(int w, int h, int oldl, int oldt) {
            super.onSizeChanged(w, h, oldl, oldt);
            width = w;
            height = h;
        }
    
        public Pview(Context context) {
            super(context);
            // 设置聚焦
            setFocusable(true);
            // 图形的绘制,运动方向
            // 自由任务交给定时任务去做
            TimerTask mTask = new TimerTask() {
    
                @Override
                public void run() {
                    // 绘制圆的运动方向(自由匀速)
                    if (dirx == 0) {
                        cirx += 5;
                    }
                    if (dirx == 1) {
                        cirx -= 5;
                    }
                    if (diry == 0) {
                        ciry += 5;
                    }
                    if (diry == 1) {
                        ciry -= 5;
                    }
                    // 修改运动方向
                    // 最右边
                    if (cirx + radius > width) {
                        dirx = 1;
                    }
                    // 最左边
                    if (cirx - radius < 0) {
                        dirx = 0;
                    }
                    // 最下边
                    if (ciry + radius > height) {
                        diry = 1;
                    }
                    // 最上边
                    if (ciry - radius < 0) {
                        diry = 0;
                    }
                    // 球碰到矩形也要更改方向
                    if (cirx > rectx && cirx < rectx + 300) {
                        if (ciry + radius > recty) {
                            diry = 1;// 往上走
                        }
    //                  if (ciry - radius < recty) {
    //                      diry = 0;// 往下走
    //                  }
                    }
                    postInvalidate();// 进行实时刷新
                }
            };
            // 把任务加到计时器里面去
            mTimer.schedule(mTask, 1, 20);
        }
    
            // 绘制图形
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            mPaint = new Paint();
            mPaint.setColor(Color.RED);
            canvas.drawCircle(cirx, ciry, radius, mPaint);// 画圆
    
            mPaint.setColor(Color.BLACK);
            canvas.drawRect(rectx, recty, rectx + 300, recty + 2, mPaint);// 画矩形
        }
    
        //控制板上下移动
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
    
            switch (keyCode) {
            case KeyEvent.KEYCODE_DPAD_DOWN:
                recty+=15;
                break;
            case KeyEvent.KEYCODE_DPAD_UP:
                recty-=15;
                break;
            case KeyEvent.KEYCODE_DPAD_LEFT:
                rectx-=15;
                break;
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                rectx+=15;
                break;
    
            default:
                break;
            }
            return true;
        }
    }
    
    
    • MainActivity.java(引用View)

    public class MainActivity extends Activity {
    
        private Pview mPview = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            mPview = new Pview(this);
            super.onCreate(savedInstanceState);
            // setContentView(R.layout.activity_main);
            setContentView(mPview);
            mPview.requestFocus();
        }
    }
    
    
    • 演示

    action.gif

    相关文章

      网友评论

          本文标题:运动的小球

          本文链接:https://www.haomeiwen.com/subject/xfjcrttx.html