zoukankan      html  css  js  c++  java
  • 安卓旅途之——开发数独(二)

    安卓旅途之——开发数独(二)

    二、绘制九宫格

    /***
     * Excerpted from "Hello, Android!",
     * published by The Pragmatic Bookshelf.
     * Copyrights apply to this code. It may not be used to create training material, 
     * courses, books, articles, and the like. Contact us if you are in doubt.
     * We make no guarantees that this code is fit for any purpose. 
     * Visit http://www.pragmaticprogrammer.com/titles/eband for more book information.
    ***/
    
    package org.example.sudoku;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.graphics.Paint.FontMetrics;
    import android.graphics.Paint.Style;
    
    import android.os.Bundle;
    import android.os.Parcelable;
    
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.animation.AnimationUtils;
    
    
    public class PuzzleView extends View {
       
       private static final String TAG = "数独 ";
    
       
       private static final String SELX = "selX"; 
       private static final String SELY = "selY";
       private static final String VIEW_STATE = "viewState";
       private static final int ID = 42; 
    
       
       private float width;    
       private float height;   
       private int selX;       
       private int selY;       
       private final Rect selRect = new Rect();
    
       private final Game game;
       
       public PuzzleView(Context context) {
          
          super(context);
          this.game = (Game) context;
          setFocusable(true);
          setFocusableInTouchMode(true);
          
          // ...
          setId(ID); 
       }
    
       @Override
       protected Parcelable onSaveInstanceState() { 
          Parcelable p = super.onSaveInstanceState();
          Log.d(TAG, "onSaveInstanceState");
          Bundle bundle = new Bundle();
          bundle.putInt(SELX, selX);
          bundle.putInt(SELY, selY);
          bundle.putParcelable(VIEW_STATE, p);
          return bundle;
       }
       @Override
       protected void onRestoreInstanceState(Parcelable state) { 
          Log.d(TAG, "onRestoreInstanceState");
          Bundle bundle = (Bundle) state;
          select(bundle.getInt(SELX), bundle.getInt(SELY));
          super.onRestoreInstanceState(bundle.getParcelable(VIEW_STATE));
          return;
       }
       
    
       @Override
       protected void onSizeChanged(int w, int h, int oldw, int oldh) {
          width = w / 9f;
          height = h / 9f;
          getRect(selX, selY, selRect);
          Log.d(TAG, "onSizeChanged: width " + width + ", height "
                + height);
          super.onSizeChanged(w, h, oldw, oldh);
       }
    
       @Override
       protected void onDraw(Canvas canvas) {
          //改写onDraw函数绘制背景
          Paint background = new Paint();
          background.setColor(getResources().getColor(
                R.color.puzzle_background));
          canvas.drawRect(0, 0, getWidth(), getHeight(), background);
    
          
         
          
          //画线
          Paint dark = new Paint();
          dark.setColor(getResources().getColor(R.color.puzzle_dark));
    
          Paint hilite = new Paint();
          hilite.setColor(getResources().getColor(R.color.puzzle_hilite));
    
          Paint light = new Paint();
          light.setColor(getResources().getColor(R.color.puzzle_light));
    
          
          for (int i = 0; i < 9; i++) {
             canvas.drawLine(0, i * height, getWidth(), i * height,
                   light);
             canvas.drawLine(0, i * height + 1, getWidth(), i * height
                   + 1, hilite);
             canvas.drawLine(i * width, 0, i * width, getHeight(),
                   light);
             canvas.drawLine(i * width + 1, 0, i * width + 1,
                   getHeight(), hilite);
          }
    
          for (int i = 0; i < 9; i++) {
             if (i % 3 != 0)
                continue;
             canvas.drawLine(0, i * height, getWidth(), i * height,
                   dark);
             canvas.drawLine(0, i * height + 1, getWidth(), i * height
                   + 1, hilite);
             canvas.drawLine(i * width, 0, i * width, getHeight(), dark);
             canvas.drawLine(i * width + 1, 0, i * width + 1,
                   getHeight(), hilite);
          }
    
        //绘制数字
          Paint foreground = new Paint(Paint.ANTI_ALIAS_FLAG);
          foreground.setColor(getResources().getColor(
                R.color.puzzle_foreground));
          foreground.setStyle(Style.FILL);
          foreground.setTextSize(height * 0.75f);
          foreground.setTextScaleX(width / height);
          foreground.setTextAlign(Paint.Align.CENTER);
    
          
          FontMetrics fm = foreground.getFontMetrics();
         
          float x = width / 2;
          
          float y = height / 2 - (fm.ascent + fm.descent) / 2;
          for (int i = 0; i < 9; i++) {
             for (int j = 0; j < 9; j++) {
                canvas.drawText(this.game.getTileString(i, j), i
                      * width + x, j * height + y, foreground);
             }
          }
    
          
          if (Prefs.getHints(getContext())) {
            
             Paint hint = new Paint();
             int c[] = { getResources().getColor(R.color.puzzle_hint_0),
                   getResources().getColor(R.color.puzzle_hint_1),
                   getResources().getColor(R.color.puzzle_hint_2), };
             Rect r = new Rect();
             for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                   int movesleft = 9 - game.getUsedTiles(i, j).length;
                   if (movesleft < c.length) {
                      getRect(i, j, r);
                      hint.setColor(c[movesleft]);
                      canvas.drawRect(r, hint);
                   }
                }
             }
             
          }
          
    
      
          Log.d(TAG, "selRect=" + selRect);
          Paint selected = new Paint();
          selected.setColor(getResources().getColor(
                R.color.puzzle_selected));
          canvas.drawRect(selRect, selected);
       }
    
       @Override
       public boolean onTouchEvent(MotionEvent event) {
          if (event.getAction() != MotionEvent.ACTION_DOWN)
             return super.onTouchEvent(event);
    
          select((int) (event.getX() / width),
                (int) (event.getY() / height));
          game.showKeypadOrError(selX, selY);
          Log.d(TAG, "onTouchEvent: x " + selX + ", y " + selY);
          return true;
       }
    
       @Override
       public boolean onKeyDown(int keyCode, KeyEvent event) {
          Log.d(TAG, "onKeyDown: keycode=" + keyCode + ", event="
                + event);
          switch (keyCode) {
          case KeyEvent.KEYCODE_DPAD_UP:
             select(selX, selY - 1);
             break;
          case KeyEvent.KEYCODE_DPAD_DOWN:
             select(selX, selY + 1);
             break;
          case KeyEvent.KEYCODE_DPAD_LEFT:
             select(selX - 1, selY);
             break;
          case KeyEvent.KEYCODE_DPAD_RIGHT:
             select(selX + 1, selY);
             break;
          case KeyEvent.KEYCODE_0:
          case KeyEvent.KEYCODE_SPACE: setSelectedTile(0); break;
          case KeyEvent.KEYCODE_1:     setSelectedTile(1); break;
          case KeyEvent.KEYCODE_2:     setSelectedTile(2); break;
          case KeyEvent.KEYCODE_3:     setSelectedTile(3); break;
          case KeyEvent.KEYCODE_4:     setSelectedTile(4); break;
          case KeyEvent.KEYCODE_5:     setSelectedTile(5); break;
          case KeyEvent.KEYCODE_6:     setSelectedTile(6); break;
          case KeyEvent.KEYCODE_7:     setSelectedTile(7); break;
          case KeyEvent.KEYCODE_8:     setSelectedTile(8); break;
          case KeyEvent.KEYCODE_9:     setSelectedTile(9); break;
          case KeyEvent.KEYCODE_ENTER:
          case KeyEvent.KEYCODE_DPAD_CENTER:
             game.showKeypadOrError(selX, selY);
             break;
          default:
             return super.onKeyDown(keyCode, event);
          }
          return true;
       }
    
       public void setSelectedTile(int tile) {
          if (game.setTileIfValid(selX, selY, tile)) {
             invalidate();
          } else {
           
             Log.d(TAG, "setSelectedTile: invalid: " + tile);
             startAnimation(AnimationUtils.loadAnimation(game,
                   R.anim.shake));
          }
       }
    
       private void select(int x, int y) {
          invalidate(selRect);
          selX = Math.min(Math.max(x, 0), 8);
          selY = Math.min(Math.max(y, 0), 8);
          getRect(selX, selY, selRect);
          invalidate(selRect);
       }
    
       private void getRect(int x, int y, Rect rect) {
          rect.set((int) (x * width), (int) (y * height), (int) (x
                * width + width), (int) (y * height + height));
       }
     
    }
    绘制背景九宫格

    三、添加音乐

    添加音乐其实很简单的,写一个音乐类,然后把音乐资源传递进去,那就ok了。不过我做的时候,太大的音乐是不可以了,只能是几百MB的

    /***
     * Excerpted from "Hello, Android!",
     * published by The Pragmatic Bookshelf.
     * Copyrights apply to this code. It may not be used to create training material, 
     * courses, books, articles, and the like. Contact us if you are in doubt.
     * We make no guarantees that this code is fit for any purpose. 
     * Visit http://www.pragmaticprogrammer.com/titles/eband for more book information.
    ***/
    package org.example.sudoku;
    
    import android.content.Context;
    import android.media.MediaPlayer;
    
    public class Music {
       private static MediaPlayer mp = null;
    
       
       //播放音乐
       public static void play(Context context, int resource) {
          stop(context);
    
          //一直播放音乐
          if (Prefs.getMusic(context)) {
             mp = MediaPlayer.create(context, resource);
             mp.setLooping(true);
             mp.start();
          }
       }
       
    
       //停止音乐
       public static void stop(Context context) { 
          if (mp != null) {
             mp.stop();
             mp.release();
             mp = null;
          }
       }
    }
    Music

      @Override
       protected void onResume() {
          super.onResume();
          Music.play(this, R.raw.kaitou);//调用play方法播放音乐
       }

       @Override
       protected void onPause() {
          super.onPause();
          Music.stop(this);//停止播放当前的音乐
       }
       是不是超简单的呢?是的!!!!!!!!!!!!!

  • 相关阅读:
    Struts2 技术全总结 (正在更新)
    Servlet 技术全总结 (已完成,不定期增加内容)
    字节顺序&字节对齐
    Kubernetes 清除持续 Terminating 状态的Pods
    [K8s]无yaml文件重启Pod
    外部访问docker容器(docker run -p/-P 指令)
    Linux (OpenBSD)系统目录分析
    CPU Cache 机制以及 Cache miss
    ifconfig 中的 eth0 eth0:1 eth0.1 与 lo
    MYSQL 文件类型
  • 原文地址:https://www.cnblogs.com/IvesHe/p/4838148.html
Copyright © 2011-2022 走看看