Android实现中国象棋附源码下载

象棋,很多人多接触过,学者写了一个,大神可以指点一下~直接上代码:
贴出主要代码,想要Demo的点击下载:中国象棋Demo

package wyf.ytl; 

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.MediaPlayer;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
 * 该类是整个程序最主要的类,是主游戏的界面
 * 该界面继承自SurfaceView并实现了SurfaceHolder.Callback接口
 * 其中包含了一个刷帧的线程类
 *
 */
public class GameView extends SurfaceView implements SurfaceHolder.Callback{
  private TutorialThread thread;//刷帧的线程
  TimeThread timeThread ;
  ChessActivity activity;//声明Activity的引用
  Bitmap qiPan;//棋盘
  Bitmap qizibackground;//棋子的背景图片
  Bitmap win;//胜利的图片
  Bitmap lost;//失败的图片
  Bitmap ok;//确定按钮
  Bitmap vs;//黑方红方VS的图片
  Bitmap right;//向右的指针
  Bitmap left;//向左的指针
  Bitmap current;//“当前”文字
  Bitmap exit2;//退出按钮图片
  Bitmap sound2;//声音按钮图片
  Bitmap sound3;//当前是否播放了声音
  Bitmap time;//冒号
  Bitmap redtime;//红色冒号
  Bitmap background;//背景图片
  MediaPlayer go;//下棋声音
  Paint paint;//画笔
  boolean caiPan = true;//是否为玩家走棋
  boolean focus = false;//当前是否有选中的棋子
  int selectqizi = 0; //当然选中的棋子 

  int startI, startJ;//记录当前棋子的开始位置
  int endI, endJ;//记录当前棋子的目标位置
  Bitmap[] heiZi = new Bitmap[7];//黑子的图片数组
  Bitmap[] hongZi = new Bitmap[7];//红子的图片数组
  Bitmap[] number = new Bitmap[10];//数字的图片数组,用于显示时间
  Bitmap[] redNumber = new Bitmap[10];//红色数字的图片,用于显示时间  

  GuiZe guiZe;//规则类 

  int status = 0;//游戏状态。0游戏中,1胜利, 2失败
  int heiTime = 0;//黑方总共思考时间
  int hongTime = 0;//红方总共思考时间  

  int[][] qizi = new int[][]{//棋盘
    {2,3,6,5,1,5,6,3,2},
    {0,0,0,0,0,0,0,0,0},
    {0,4,0,0,0,0,0,4,0},
    {7,0,7,0,7,0,7,0,7},
    {0,0,0,0,0,0,0,0,0}, 

    {0,0,0,0,0,0,0,0,0},
    {14,0,14,0,14,0,14,0,14},
    {0,11,0,0,0,0,0,11,0},
    {0,0,0,0,0,0,0,0,0},
    {9,10,13,12,8,12,13,10,9},
  }; 

  public GameView(Context context,ChessActivity activity) {//构造器
    super(context);
    this.activity = activity;//得到Activity的引用
    getHolder().addCallback(this);
    go = MediaPlayer.create(this.getContext(), R.raw.go);//加载下棋的声音
    this.thread = new TutorialThread(getHolder(), this);//初始化刷帧线程
    this.timeThread = new TimeThread(this);//初始化思考时间的线程
    init();//初始化所需资源
    guiZe = new GuiZe();//初始化规则类
  } 

  public void init(){//初始化方法
    paint = new Paint();//初始化画笔
    qiPan = BitmapFactory.decodeResource(getResources(), R.drawable.qipan);//棋盘图片
    qizibackground = BitmapFactory.decodeResource(getResources(), R.drawable.qizi);//棋子的背景
    win = BitmapFactory.decodeResource(getResources(), R.drawable.win);//胜利的图片
    lost = BitmapFactory.decodeResource(getResources(), R.drawable.lost);//失败的图片
    ok = BitmapFactory.decodeResource(getResources(), R.drawable.ok);//确定按钮图片
    vs = BitmapFactory.decodeResource(getResources(), R.drawable.vs);//vs字样的图片
    right = BitmapFactory.decodeResource(getResources(), R.drawable.right);//向右的指针
    left = BitmapFactory.decodeResource(getResources(), R.drawable.left);//向左的指针
    current = BitmapFactory.decodeResource(getResources(), R.drawable.current);//文字“当前”
    exit2 = BitmapFactory.decodeResource(getResources(), R.drawable.exit2);//退出按钮图片
    sound2 = BitmapFactory.decodeResource(getResources(), R.drawable.sound2);//声音按钮图片
    time = BitmapFactory.decodeResource(getResources(), R.drawable.time);//黑色冒号
    redtime = BitmapFactory.decodeResource(getResources(), R.drawable.redtime);//红色冒号
    sound3 = BitmapFactory.decodeResource(getResources(), R.drawable.sound3); 

    heiZi[0] = BitmapFactory.decodeResource(getResources(), R.drawable.heishuai);//黑帅
    heiZi[1] = BitmapFactory.decodeResource(getResources(), R.drawable.heiju);//黑车
    heiZi[2] = BitmapFactory.decodeResource(getResources(), R.drawable.heima);//黑马
    heiZi[3] = BitmapFactory.decodeResource(getResources(), R.drawable.heipao);//黑炮
    heiZi[4] = BitmapFactory.decodeResource(getResources(), R.drawable.heishi);//黑士
    heiZi[5] = BitmapFactory.decodeResource(getResources(), R.drawable.heixiang);//黑象
    heiZi[6] = BitmapFactory.decodeResource(getResources(), R.drawable.heibing);//黑兵 

    hongZi[0] = BitmapFactory.decodeResource(getResources(), R.drawable.hongjiang);//红将
    hongZi[1] = BitmapFactory.decodeResource(getResources(), R.drawable.hongju);//红车
    hongZi[2] = BitmapFactory.decodeResource(getResources(), R.drawable.hongma);//红马
    hongZi[3] = BitmapFactory.decodeResource(getResources(), R.drawable.hongpao);//红砲
    hongZi[4] = BitmapFactory.decodeResource(getResources(), R.drawable.hongshi);//红仕
    hongZi[5] = BitmapFactory.decodeResource(getResources(), R.drawable.hongxiang);//红相
    hongZi[6] = BitmapFactory.decodeResource(getResources(), R.drawable.hongzu);//红卒 

    number[0] = BitmapFactory.decodeResource(getResources(), R.drawable.number0);//黑色数字0
    number[1] = BitmapFactory.decodeResource(getResources(), R.drawable.number1);//黑色数字1
    number[2] = BitmapFactory.decodeResource(getResources(), R.drawable.number2);//黑色数字2
    number[3] = BitmapFactory.decodeResource(getResources(), R.drawable.number3);//黑色数字3
    number[4] = BitmapFactory.decodeResource(getResources(), R.drawable.number4);//黑色数字4
    number[5] = BitmapFactory.decodeResource(getResources(), R.drawable.number5);//黑色数字5
    number[6] = BitmapFactory.decodeResource(getResources(), R.drawable.number6);//黑色数字6
    number[7] = BitmapFactory.decodeResource(getResources(), R.drawable.number7);//黑色数字7
    number[8] = BitmapFactory.decodeResource(getResources(), R.drawable.number8);//黑色数字8
    number[9] = BitmapFactory.decodeResource(getResources(), R.drawable.number9);//黑色数字9 

    redNumber[0] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber0);//红色数字0
    redNumber[1] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber1);//红色数字1
    redNumber[2] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber2);//红色数字2
    redNumber[3] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber3);//红色数字3
    redNumber[4] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber4);//红色数字4
    redNumber[5] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber5);//红色数字5
    redNumber[6] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber6);//红色数字6
    redNumber[7] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber7);//红色数字7
    redNumber[8] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber8);//红色数字8
    redNumber[9] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber9);//红色数字9 

    background = BitmapFactory.decodeResource(getResources(), R.drawable.bacnground); 

  }
  /**
   * 该方法是自己定义的并非重写的
   * 该方法是死的,只根据数据绘制屏幕
   */
  public void onDraw(Canvas canvas){//自己写的绘制方法
    canvas.drawColor(Color.WHITE);
    canvas.drawBitmap(background, 0,0, null);//清背景
    canvas.drawBitmap(qiPan, 10, 10, null);//绘制棋盘
    for(int i=0; i<qizi.length; i++){
      for(int j=0; j<qizi[i].length; j++){//绘制棋子
        if(qizi[i][j] != 0){
          canvas.drawBitmap(qizibackground, 9+j*34, 10+i*35, null);//绘制棋子的背景
          if(qizi[i][j] == 1){//为黑帅时
            canvas.drawBitmap(heiZi[0], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 2){//为黑车时
            canvas.drawBitmap(heiZi[1], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 3){//为黑马时
            canvas.drawBitmap(heiZi[2], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 4){//为黑炮时
            canvas.drawBitmap(heiZi[3], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 5){//为黑士时
            canvas.drawBitmap(heiZi[4], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 6){//为黑象时
            canvas.drawBitmap(heiZi[5], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 7){//为黑兵时
            canvas.drawBitmap(heiZi[6], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 8){//为红将时
            canvas.drawBitmap(hongZi[0], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 9){//为红车时
            canvas.drawBitmap(hongZi[1], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 10){//为红马时
            canvas.drawBitmap(hongZi[2], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 11){//为红砲时
            canvas.drawBitmap(hongZi[3], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 12){//为红仕时
            canvas.drawBitmap(hongZi[4], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 13){//为红相时
            canvas.drawBitmap(hongZi[5], 12+j*34, 13+i*35, paint);
          }
          else if(qizi[i][j] == 14){//为红卒时
            canvas.drawBitmap(hongZi[6], 12+j*34, 13+i*35, paint);
          }
        }
      }
    }
    canvas.drawBitmap(vs, 10, 360, paint);//绘制VS背景图
    //绘制黑方的时间
    canvas.drawBitmap(time, 81, 411, paint);//绘制冒号
    int temp = this.heiTime/60;//换算时间
    String timeStr = temp+"";//转换成字符串
    if(timeStr.length()<2){//当不足两位时前面填0
      timeStr = "0" + timeStr;
    }
    for(int i=0;i<2;i++){//循环绘制时间
      int tempScore=timeStr.charAt(i)-'0';
      canvas.drawBitmap(number[tempScore], 65+i*7, 412, paint);
    }
    //画分钟
    temp = this.heiTime%60;
    timeStr = temp+"";//转换成字符串
    if(timeStr.length()<2){
      timeStr = "0" + timeStr;//当长度小于2时在前面添加一个0
    }
    for(int i=0;i<2;i++){//循环
      int tempScore=timeStr.charAt(i)-'0';
      canvas.drawBitmap(number[tempScore], 85+i*7, 412, paint);//绘制
    }
    //开始绘制红方时间
    canvas.drawBitmap(this.redtime, 262, 410, paint);//红方的冒号
    int temp2 = this.hongTime/60;//换算时间
    String timeStr2 = temp2+"";//转换成字符串
    if(timeStr2.length()<2){//当不足两位时前面填0
      timeStr2 = "0" + timeStr2;
    }
    for(int i=0;i<2;i++){//循环绘制时间
      int tempScore=timeStr2.charAt(i)-'0';
      canvas.drawBitmap(redNumber[tempScore], 247+i*7, 411, paint);//绘制
    }
    //画分钟
    temp2 = this.hongTime%60;//求出当前的秒数
    timeStr2 = temp2+"";//转换成字符串
    if(timeStr2.length()<2){//不足两位时前面用0补
      timeStr2 = "0" + timeStr2;
    }
    for(int i=0;i<2;i++){//循环绘制
      int tempScore=timeStr2.charAt(i)-'0';
      canvas.drawBitmap(redNumber[tempScore], 267+i*7, 411, paint);//绘制时间数字
    }
    if(caiPan == true){//当该玩家走棋时,即红方走棋
      canvas.drawBitmap(right, 155, 420, paint);//绘制向右的指针
    }
    else{//黑方走棋,即电脑走棋时
      canvas.drawBitmap(left, 120, 420, paint);//绘制向左的指针
    } 

    canvas.drawBitmap(current, 138, 445, paint);//绘制当前文字
    canvas.drawBitmap(sound2, 10, 440, paint);//绘制声音
    if(activity.isSound){//如果正在播放声音
      canvas.drawBitmap(sound3, 80, 452, paint);//绘制
    } 

    canvas.drawBitmap(exit2, 250, 440, paint);//绘制退出按钮
    if(status == 1){//当胜利时
      canvas.drawBitmap(win, 85, 150, paint);//绘制胜利图片
      canvas.drawBitmap(ok, 113, 240, paint);
    }
    if(status == 2){//失败后
      canvas.drawBitmap(lost, 85, 150, paint);//绘制失败界面
      canvas.drawBitmap(ok, 113, 236, paint);
    }
  }
  /**
   * 该方法是游戏主要逻辑接口
   * 接受玩家输入
   * 根据点击的位置和当前的游戏状态做出相应的处理
   * 而当需要切换View时,通过给Activity发送Handler消息来处理
   * 注意的是只取屏幕被按下的事件
   */
  @Override
  public boolean onTouchEvent(MotionEvent event) {//重写的屏幕监听
    if(event.getAction() == MotionEvent.ACTION_DOWN){//只取鼠标按下的事件
      if(event.getX()>10&&event.getX()<10+sound2.getWidth()
          && event.getY()>440 && event.getY()<440+sound2.getHeight()){//按下了声音按钮
        activity.isSound = !activity.isSound;//声音取反
        if(activity.isSound){//当需要放声音时
          if(activity.gamesound != null){//gamesound不为空时
            if(!activity.gamesound.isPlaying()){//当前没有音乐时
              activity.gamesound.start();//播放音乐
            }
          }
        }
        else{
          if(activity.gamesound != null){//gamesound不为空时
            if(activity.gamesound.isPlaying()){//当前有音乐时
              activity.gamesound.pause();//停止音乐
            }
          }
        }
      }//end 按下了声音按钮
      if(event.getX()>250&&event.getX()<250+exit2.getWidth()
          && event.getY()>440 && event.getY()<440+exit2.getHeight()){//按下了退出按钮
        activity.myHandler.sendEmptyMessage(1);//发送消息,切换到MenuView
      }
      if(status == 1){//胜利后
        if(event.getX()>135&&event.getX()<190
            && event.getY()>249 && event.getY()<269){//点击了确定按钮
          activity.myHandler.sendEmptyMessage(1);//发送消息,切换到MenuView
        }
      }
      else if(status == 2){//失败后
        if(event.getX()>135&&event.getX()<190
            && event.getY()>245 && event.getY()<265){//点击了确定按钮
          activity.myHandler.sendEmptyMessage(1);//发送消息,切换到MenuView
        }
      }
      /**
       * 游戏过程中的逻辑处理
       * 当点击棋盘时,先判断当前是否为玩家走棋,
       * 然后再判断当然玩家是否已经有选中的棋子,如果没有则选中
       * 如果之前有选中的棋子,再判断点击的位置是空地、对方棋子还是自己的棋子
       * 是空地判断是否可走
       * 是对方棋子同样判断是否可以走,能走自然吃子
       * 是自己的棋子则选中该棋子
       */
      else if(status == 0){//游戏中时
        if(event.getX()>10&&event.getX()<310
            && event.getY()>10 && event.getY()<360){//点击的位置在棋盘内时
            if(caiPan == true){//如果是该玩家走棋
              int i = -1, j = -1;
              int[] pos = getPos(event);//根据坐标换算成所在的行和列
              i = pos[0];
              j = pos[1];
              if(focus == false){//之前没有选中的棋子
                if(qizi[i][j] != 0){//点击的位置有棋子
                  if(qizi[i][j] > 7){//点击的是自己的棋子。即下面的黑色棋子
                    selectqizi = qizi[i][j];//将该棋子设为选中的棋子
                    focus = true;//标记当前有选中的棋子
                    startI = i;
                    startJ = j;
                  }
                }
              }
              else{//之前选中过棋子
                if(qizi[i][j] != 0){//点击的位置有棋子
                  if(qizi[i][j] > 7){//如果是自己的棋子.
                    selectqizi = qizi[i][j];//将该棋子设为选中的棋子
                    startI = i;
                    startJ = j;
                  }
                  else{//如果是对方的棋子
                    endI = i;
                    endJ = j;//保存该点
                    boolean canMove = guiZe.canMove(qizi, startI, startJ, endI, endJ);
                    if(canMove){//如果可以移动过去
                      caiPan = false;//不让玩家走了
                      if(qizi[endI][endJ] == 1 || qizi[endI][endJ] == 8){//如果是“帅”或“将”
                        this.success();//胜利了
                      }
                      else{
                        if(activity.isSound){
                          go.start();//播放下棋声音
                        }
                        qizi[endI][endJ] = qizi[startI][startJ];//移动棋子
                        qizi[startI][startJ] = 0;//将原来处设空
                        startI = -1;
                        startJ = -1;
                        endI = -1;
                        endJ = -1;//还原保存点
                        focus = false;//标记当前没有选中棋子 

                        ChessMove cm = guiZe.searchAGoodMove(qizi);//根据当前局势查询一个最好的走法
                        if(activity.isSound){
                          go.start();//播放下棋声音
                        }
                        qizi[cm.toX][cm.toY] = qizi[cm.fromX][cm.fromY];//移动棋子
                        qizi[cm.fromX][cm.fromY] = 0;
                        caiPan = true;//恢复玩家响应
                      }
                    }
                  }
                }//end点击的位置有棋子
                else{//如果点击的位置没有棋子
                  endI = i;
                  endJ = j;
                  boolean canMove = guiZe.canMove(qizi, startI, startJ, endI, endJ);//查看是否可走
                  if(canMove){//如果可以移动
                    caiPan = false;//不让玩家走了
                    if(activity.isSound){
                      go.start();//播放下棋声音
                    }
                    qizi[endI][endJ] = qizi[startI][startJ];//移动棋子
                    qizi[startI][startJ] = 0;//将原来处置空
                    startI = -1;
                    startJ = -1;
                    endI = -1;
                    endJ = -1;//还原保存点
                    focus = false;//标志位设false 

                    ChessMove cm = guiZe.searchAGoodMove(qizi);//得到一步走法
                    if(qizi[cm.toX][cm.toY] == 8){//电脑吃了您的将
                      status = 2;//切换游戏状态为失败
                    }
                    if(activity.isSound){//需要播放声音时
                      go.start();//播放下棋声音
                    }
                    qizi[cm.toX][cm.toY] = qizi[cm.fromX][cm.fromY];//移动棋子
                    qizi[cm.fromX][cm.fromY] = 0;
                    caiPan = true;//恢复玩家响应
                  }
                }
              }//end 之前选中过棋子
            }
          }//end点击的位置在棋盘内时
      }//end游戏中时
    }
    return super.onTouchEvent(event);
  } 

  public int[] getPos(MotionEvent e){//将坐标换算成数组的维数
    int[] pos = new int[2];
    double x = e.getX();//得到点击位置的x坐标
    double y = e.getY();//得到点击位置的y坐标
    if(x>10 && y>10 && x<10+qiPan.getWidth() && y<10+qiPan.getHeight()){//点击的是棋盘时
      pos[0] = Math.round((float)((y-21)/36));//取得所在的行
      pos[1] = Math.round((float)((x-21)/35));//取得所在的列
    }
    else{//点击的位置不是棋盘时
      pos[0] = -1;//将位置设为不可用
      pos[1] = -1;
    }
    return pos;//将坐标数组返回
  } 

  public void success(){//胜利了
    status = 1;//切换到胜利状态
  } 

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

  public void surfaceCreated(SurfaceHolder holder) {//重写的
    this.thread.setFlag(true);
    this.thread.start();//启动刷帧线程
    timeThread.setFlag(true);
    timeThread.start();//启动思考时间的线程
  } 

  public void surfaceDestroyed(SurfaceHolder holder) {//view被释放时调用的
    boolean retry = true;
    thread.setFlag(false);//停止刷帧线程
    timeThread.setFlag(false);//停止思考时间线程
    while (retry) {
      try {
        thread.join();
        timeThread.join();//等待线程结束
        retry = false;//设置循环标志位为false
      }
      catch (InterruptedException e) {//不断地循环,直到等待的线程结束
      }
    }
  }
  class TutorialThread extends Thread{//刷帧线程
    private int span = 300;//睡眠的毫秒数
    private SurfaceHolder surfaceHolder;//SurfaceHolder的引用
    private GameView gameView;//gameView的引用
    private boolean flag = false;//循环标志位
    public TutorialThread(SurfaceHolder surfaceHolder, GameView gameView) {//构造器
      this.surfaceHolder = surfaceHolder;//得到SurfaceHolder引用
      this.gameView = gameView;//得到GameView的引用
    }
    public void setFlag(boolean flag) {//设置循环标记
      this.flag = flag;
    }
    public void run() {//重写的方法
      Canvas c;//画布
      while (this.flag) {//循环绘制
        c = null;
        try {
          c = this.surfaceHolder.lockCanvas(null);
          synchronized (this.surfaceHolder) {
            gameView.onDraw(c);//调用绘制方法
          }
        } finally {//用finally保证下面代码一定被执行
          if (c != null) {
            //更新屏幕显示内容
            this.surfaceHolder.unlockCanvasAndPost(c);
          }
        }
        try{
          Thread.sleep(span);//睡眠span毫秒
        }catch(Exception e){//不会异常信息
          e.printStackTrace();//打印异常堆栈信息
        }
      }
    }
  }
} 

以上就是本文的全部内容,好好玩吧,希望对大家的学习也有帮助。

(0)

相关推荐

  • Android RecyclerView的Item自定义动画及DefaultItemAnimator源码分析

    这是关于RecyclerView的第二篇,说的是如何自定义Item动画,但是请注意,本文不包含动画的具体实现方法,只是告诉大家如何去自定义动画,如何去参考源代码. 我们知道,RecyclerView默认会使用DefaultItemAnimator,所以如果我们需要自定义动画,那么应该好好的读读这个类的源代码,这样不仅仅是学习怎么自定义,还要学习Android的设计模式. 先弄明白一件事,DefaultItemAnimator继承自SimpleItemAnimator,SimpleItemAnim

  • Android编程实现可滑动的开关效果(附demo源码下载)

    本文实例讲述了Android编程实现可滑动的开关效果.分享给大家供大家参考,具体如下: 闲着没事,把之前写的一个Demo放上来分享下.就是一个开关,实现可滑动和动画效果.不是图片切换. 好了,先上图: 完整实例代码点击此处本站下载. 直接把自定义的这个View代码放上来,有注释应该很好理解: 首先是布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&qu

  • Android 日志系统Logger源代码详细介绍

    我们知道,在Android系统中,提供了一个轻量级的日志系统,这个日志系统是以驱动程序的形式实现在内核空间的,而在用户空间分别提供了Java接口和C/C++接口来使用这个日志系统,取决于你编写的是Android应用程序还是系统组件.在前面的文章浅谈Android系统开发中LOG的使用中,已经简要地介绍了在Android应用程序开发中Log的使用方法,在这一篇文章中,我们将更进一步地分析Logger驱动程序的源代码,使得我们对Android日志系统有一个深刻的认识. 既然Android 日志系统是

  • Android Volley框架使用源码分享

    过去在Android上网络通信都是使用的Xutils 因为用它可以顺道处理了图片和网络这两个方面,后来发觉Xutils里面使用的是HttpClient  而Google在6.0的版本上已经把HttpClient废除了,所以开始寻找新的网络框架,okhttp也用过,但是它是在作用在UI线程,使用起来还需要用handler 所以就先用着Volley框架了.  这里我先分析下Volley框架的简单网络请求的源码. 使用Volley请求网络数据的简单过程: RequestQueue queue = Vo

  • Android源码 在Ubuntu上下载,编译和安装

    看完了前面说的几本书之后,对Linux Kernel和Android有一定的认识了,是不是心里蠢蠢欲动,想小试牛刀自己编译一把Android源代码了呢?一直习惯使用Windows系统,而Android源代码是不支持在Windows上编译上,于是决定使用虚拟机安装Ubuntu,然后下载.编译和安装Android源代码.      一. 环境准备. 1. 磁盘空间预留20G左右,内存3G,因为一边要跑主机,一边要跑虚拟机,内存要求还是比较高的,这样才会比较流畅. 2. 安装VMWare 7.1.4.

  • 详解Android中用于线程处理的AsyncTask类的用法及源码

    为什么要用AsyncTask 我们写App都有一个原则,主线程不能够运行需要占用大量CPU时间片的任务,如大量复杂的浮点运算,较大的磁盘IO操作,网络socket等,这些都会导致我们的主线程对用户的响应变得迟钝,甚至ANR,这些会使应用的用户体验变差,但是有时又的确需要执行这些耗时的任务,那么我们通常可以使用AsyncTask或者new Thread 来处理,这样把任务放入工作线程中执行,不会占用主线程的时间片,所以主线程会及时响应用户的操作,如果使用new Thread来执行任务,那么如果需要

  • Android内核源码 在Ubuntu上下载,编译,安装

    从源代码树下载下来的最新Android源代码,是不包括内核代码的,也就是Android源代码工程默认不包含Linux Kernel代码,而是使用预先编译好的内核,也就是prebuilt/android-arm/kernel/kernel-qemu文件.那么,如何才能DIY自己的内核呢?这篇文章一一道来. 一. 首选,参照前一篇在Android源码 在Ubuntu上下载,编译和安装准备好Android源代码目录.       二. 下载Linux Kernel for Android源代码. 1.

  • 从源码分析Android的Glide库的图片加载流程及特点

    0.基础知识 Glide中有一部分单词,我不知道用什么中文可以确切的表达出含义,用英文单词可能在行文中更加合适,还有一些词在Glide中有特别的含义,我理解的可能也不深入,这里先记录一下. (1)View: 一般情况下,指Android中的View及其子类控件(包括自定义的),尤其指ImageView.这些控件可在上面绘制Drawable (2)Target: Glide中重要的概念,目标.它即可以指封装了一个View的Target(ViewTarget),也可以不包含View(SimpleTa

  • Android实现软件列表的点击启动另外一个程序功能【附demo源码下载】

    本文实例讲述了Android实现软件列表的点击启动另外一个程序功能.分享给大家供大家参考,具体如下: 目前面世的许多软件中有这么一个功能:设备中安装了哪些软件,他们会以一个软件列表清单的形式向用户展示出来. 今天我们就来实现这一功能: 运行环境: motorola defy+ 系统2.3.6 主要 API : PackageInfo,PackageManager,LayoutInflater,ApplicationInfo PackageManger类,它的主要职责是管理应用程序包. 通过它,我

  • Android实现中国象棋附源码下载

    象棋,很多人多接触过,学者写了一个,大神可以指点一下~直接上代码: 贴出主要代码,想要Demo的点击下载:中国象棋Demo package wyf.ytl; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; impor

  • Android编程实现画板功能的方法总结【附源码下载】

    本文实例讲述了Android编程实现画板功能的方法.分享给大家供大家参考,具体如下: Android实现画板主要有2种方式,一种是用自定义View实现,另一种是通过Canvas类实现.当然自定义View内部也是用的Canvas.第一种方式的思路是,创建一个自定义View(推荐SurfaceView),在自定义View里通过Path对象记录手指滑动的路径调用lineTo()绘制:第二种方式的思路是,先用Canvas绘制一张空的Bitmap,通过ImageView的setImageBitmap()方

  • jQuery实现产品对比功能附源码下载

    产品对比相信大家并不陌生,为了方便用户对类似产品的相关信息进行有效直观的对比,一些电商网站产品或评测网站会为用户提供产品对比的功能,用户只需勾选多个需要对比的产品,就可以进行比对.本文将使用jQuery来给大家讲解如何实现产品对比功能. 查看演示     下载源码 HTML HTML结构我们分三部分,第一是产品列表部分,展示所有可以对比的产品.我们以某手机网站为例,简单的结构,只需展示产品图片和名称,以及一个添加按钮.注意我们把手机的相关参数信息都放在属性data-*里,等会后面展示对比信息的时

  • 自定义Android六边形进度条(附源码)

    本文实例讲述了Android自定义圆形进度条,分享给大家供大家参考.具体如下: 大家也可以参考这两篇文章进行学习: <自定义Android圆形进度条(附源码)>   <Android带进度的圆形进度条> 运行效果截图如下: 主要代码: package com.sxc.hexagonprogress; import java.util.Random; import android.content.Context; import android.content.res.ColorSta

  • Android10.0实现本地音乐播放(附源码下载)

    1.概述 本篇文章仅是Android小白在写一个小程序,内容仅供参考,有很多不足之处希望各位大神指出,文章末尾有整个项目的下载,不需要币,只求帮你们解决到问题的同时收获到一颗小小的赞.这个项目中还有很多不足的地方,如:在按键中设置图片文字,这些正常的应该交给Handler处理,我只是粗略地完成这个项目.测试环境:Android10.0.实现:自动播放下一首,正常音乐的功能,全屏显示. Android10.0是内外分存了的,应用是没有权限读取内存的,需要在配置文件中application中加上属性

  • jQuery日期范围选择器附源码下载

    jQuery Date Range Picker是一款允许用户选择一个日期时间范围的jQuery日期选择器插件.整个日期选择器插件使用CSS来渲染样式,可以非常容易的使用CSS来定制皮肤.而且浏览器兼容性非常好,支持多种时间格式. 查看演示             下载源码 准备 使用该日期选择器插件需要 jQuery 1.3.2+和Moment 2.2.0+的支持. <link rel="stylesheet" href="css/daterangepicker.cs

  • jQuery+Ajax+PHP实现“喜欢”评级功能附源码下载

    本文章来给大家介绍一个jQuery+Ajax+PHP实现"喜欢"评级功能代码,用户点击页面中自己喜欢的图片上的红心按钮时,前端页面向后台发送一个ajax请求,后台PHP程序接收请求后,查询IP库中是否已经有该用户的点击记录,如果没有,则将对应的数值+1,同时将该用户IP信息写入IP库,反之则告诉用户已经"喜欢过了".  源码下载地址:http://xiazai.jb51.net/201509/yuanma/loveit(jb51.net).rar 实现过程 本文基于

  • 基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)

    这是一款漂亮简洁的CSS3价格表样式,该价格表基于Bootstrap网格系统来进行布局,通过简单的CSS3代码来美化价格表,样式非常的时尚漂亮,且能在不同屏幕下展示良好的效果. 查看演示     下载源码 HTML 首先在页面中引入bootstrap.min.css文件,这里我用官方的CDN资源,你也可以下载到本地使用. <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstra

  • C++实现四叉树效果(附源码下载)

    什么是四叉树? 如图,设想, 红框表示地图,星星表示单位,黄框表现范围, 要处理地图中范围内的单位,最直接的做法是筛选所有单位. 通过上图可以看到一个显而易见的问题,大部分单位都不需要被处理. 如果把地图分成块,只筛选范围覆盖的块中的单位,这样就可以减少很多不必要的筛选. 四叉树可以有效解决这个问题. 树的每一层都把地图划分四块,根据地图尺寸来决定树的层数,层数越大划分越细. 当需要对某一范围的单位筛选时,只需要定位到与范围相交的树区域,再对其区域内的对象筛选即可. 四叉树的实现 #pragma

  • 基于Jquery制作图片文字排版预览效果附源码下载

    基于jQuery图文排版图片预览特效.这是一款基于jQuery+CSS3实现的鼠标点击图片弹出画廊切换特效. 效果图如下所示,怎么样感兴趣吗,感兴趣的朋友继续往下学习哦. 效果演示    源码下载 html代码: <div id="fullscreen"> <div id="fullscreen-inner"> <div id="fullscreen-inner-left" class="fullscree

随机推荐