`

第一个Android简单程序-拼板

阅读更多
package zhch.illq;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;

public class PingBanBoard extends Activity {
    /** Called when the activity is first created. */
    Map<Integer, MyButton> buttons = new HashMap<Integer, MyButton>();
    private Map<Integer, List<Integer>> relation = new HashMap<Integer, List<Integer>>();
    // 图片分的除数
    private int colNum = 4;
    // 当前空白按钮
    private int currentBlank = colNum * colNum - 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LinearLayout mainPanel = (LinearLayout) findViewById(R.id.mainPanel);
        // 创建放图片的按钮
        for (int i = 0; i < colNum; i++) {
            LinearLayout subLayout = new LinearLayout(this);
            mainPanel.addView(subLayout);
            for (int j = 0; j < colNum; j++) {
                MyButton button = new MyButton(this);
                buttons.put(i * colNum + j, button);
                subLayout.addView(button);
            }
        }
        Drawable mm = getResources().getDrawable(R.drawable.mm);
        buttons.get(1).setBackgroundDrawable(cuteImage(mm, colNum, 1, 1));
        // 设置图片
        for (int i = 0; i < (colNum * colNum); i++) {
            buttons.get(i).setBackgroundDrawable(cuteImage(mm, colNum, i % colNum, i / colNum));
            android.util.Log.v("number 1", "" + i / colNum + "===" + i % colNum);
        }

        // 设置按钮监听器
        for (int i = 0; i < (colNum * colNum); i++) {
            MyButton button = (MyButton) buttons.get(i);
            button.position = i;
            button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    MyButton view = (MyButton) v;
                    if (moveable(colNum, view.position, currentBlank)) {
                        android.util.Log.v("currentBlank", "" + currentBlank);
                        MyButton blankView = (MyButton) buttons.get(currentBlank);
                        Drawable temp = blankView.getBackground();
                        blankView.setBackgroundDrawable(view.getBackground());
                        view.setBackgroundDrawable(temp);
                        currentBlank = view.position;

                        android.util.Log.v("currentBlank ", "" + currentBlank);
                    }
                }
            });
        }
    }

    /**
     * 取正方形图片的一部分
     * 
     * @param drawable
     *            图片
     * @param count
     *            总行数
     * @param row
     *            行
     * @param col
     *            列
     * @return
     */
    public final BitmapDrawable cuteImage(Drawable drawable, int count, int row, int col) {

        int sideLength = drawable.getIntrinsicWidth(); // 取drawable的边长
        // 取小块的边长
        int subLength = sideLength / count;
        Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
            : Bitmap.Config.RGB_565; // 取drawable的颜色格式
        Bitmap bitmap = Bitmap.createBitmap(sideLength, sideLength, config); // 建立对应bitmap
        Canvas canvas = new Canvas(bitmap); // 建立对应subBitmap的画布
        canvas.clipRect(0, 0, sideLength, sideLength);
        drawable.setBounds(0, 0, sideLength, sideLength);
        if ((row + 1) * (col + 1) != count * count) {
            drawable.draw(canvas); // 把drawable内容画到画布中
        }
        Bitmap subBitmap = Bitmap.createBitmap(bitmap, row * subLength, col * subLength, subLength, subLength);// 取图的一部分
        return new BitmapDrawable(subBitmap);
    }

    /**
     * 判断当前位置是否可以移动
     * 
     * @param colNum
     *            分割的阶数
     * @param position
     *            点击的位置
     * @param current
     *            当前空白位置
     * @return 是否能移动
     */
    private boolean moveable(int colNum, int position, int current) {
        android.util.Log.v("Math.abs(position - current) ", "" + Math.abs(position - current));
        android.util.Log.v("Math.max(position, current) ", "" + Math.max(position, current));
        if (Math.abs(position - current) == colNum) {
            return true;
        }

        if ((Math.abs(position - current) == 1) && (Math.max(position, current) % colNum != 0)) {

            return true;
        }
        return false;
    }
}
0
0
分享到:
评论

相关推荐

    5.4-拼板问题.ppt

    【5.4-拼板问题】是一个典型的组合优化问题,源于一种常见的智力玩具。这个问题涉及到在8x8的正方形底板上用8块不同形状、颜色的小拼板进行拼接,目标是使得所有小拼板完全覆盖底板,且每块拼板的两面颜色相同,由8...

    行业分类-设备装置-拼板的自动化共用测试平台结构.zip

    "行业分类-设备装置-拼板的自动化共用测试平台结构"这一主题聚焦于如何构建一个高效的自动化测试系统,以服务于拼板设备的检测需求。这个压缩包中的"拼板的自动化共用测试平台结构.pdf"文件很可能是详细阐述这一概念...

    电信设备-拼板移动式脱排油烟机.zip

    【电信设备-拼板移动式脱排油烟机】 在IT行业中,电信设备是通信网络的基础,涵盖各种硬件和软件系统,用于传输、交换和处理数据。拼板移动式脱排油烟机,虽然名称中带有“电信设备”,但实际上,它更倾向于工业...

    Altium-PCB拼板详解

    然后,需要在Y轴方向上设置一个焊盘,以便电路板生产工艺中的加工和焊接工厂的加工。焊盘的位置需要在Y轴板边的高度加0.127MM处。 mark点设置 mark点是PCB电路板生产工艺中的一个重要组成部分,用于锡膏印刷和元件...

    Altium-Design-PCB拼板完整教程.doc

    拼板的主要目的是解决单个PCB尺寸不符合加工规定的问题,通过将多个小板组合成一个大的整体板来达到合适尺寸,以便于高效地进行贴片和焊接。 首先,我们需要理解为什么要进行PCB拼板。当电路板的尺寸过小,可能无法...

    protel 99 拼板方法

    - 完成第一个PCB的放置后,继续放置其余的PCB,直到所有需要拼接的PCB都放置完毕。 ##### 步骤5:添加板边 - 在完成所有PCB的放置后,可以根据需要添加板边。 - 板边通常需要留有足够的空间以方便后续加工,一般...

    实木拼板-工艺标准.pdf

    实木拼板-工艺标准.pdf

    学位论文-—拼板机plc控制电路设计.doc

    拼板机的发展可以追溯到第一次世界大战期间,当时液压传动和气动传输技术开始发展,并奠定了拼板机的基础。经过近一个世纪的发展,液压传动技术已经相当成熟,为拼板机的发展奠定了坚实的基础。 2. 拼板机的工作...

    十分钟快速搞定CAM350拼板

    CAM350拼板的第一步是打开CAM350软件并导入 GERBER 文件。GERBER 文件是PCB设计和制造过程中的一种常见文件格式,用于描述PCB的设计和制造信息。在CAM350中导入GERBER文件后,可以进行拼板操作。 二、 改变坐标...

    简易矩形拼板

    总的来说,"简易矩形拼板"是一个涉及几何、算法和编程技术的综合性问题。通过理解和实践,我们可以提升在图形处理和计算方面的技能,同时也能锻炼解决问题和逻辑思考的能力。对于初学者来说,这是一个很好的学习项目...

    allegro PCB拼板(不同PCB)

    第一个知识点:Allegro PCB拼板的目的 Allegro PCB拼板的主要目的是将多个PCB板子组合成一个PCB板子,以便减少制板费用和提高设计效率。这可以帮助设计师更好地管理PCB设计项目,并提高设计质量。 第二个知识点:...

    10个PCB拼板不外传的秘密

    1、PCB拼板的外框(夹持边)应采用闭环设计,确保PCB拼板固定在夹具上以后不会变形; 2、PCB拼板宽度≤260mm(SIEMENS线)或≤300mm(FUJI线);如果需要自动点胶,PCB拼板宽度×长度≤125 mm×180 mm; 3、PCB...

    PCB工艺边及拼板规范

    - **定义**:拼板是指将多个较小的PCB板组合成一个较大的单元,以提高生产效率和降低制造成本。 - **尺寸要求**: - 当单个PCB板的尺寸小于50mm×50mm时,推荐进行拼板处理。 - 当单个PCB板的尺寸大于80mm×80mm时...

    allegro PCB拼板(同一PCB)

    1. 提高生产效率:Allegro PCB 拼板可以将多个 PCB 板拼接成一个大的PCB板,从而提高生产效率和降低成本。 2. 降低成本:Allegro PCB 拼板可以减少 PCB 板的尺寸,提高PCB板的密度和可靠性,从而降低成本。 3. ...

    CAM350拼板步骤,自己备份

    CAM350 是一种常用的 PCB 设计软件,拼板步骤是 CAM350 中的一项重要功能,本文将详细讲解 CAM350 拼板步骤的每个步骤,并提供相关的知识点。 一、打开 CAM350 软件并导入 GERBER 文件 在 CAM350 中,首先需要打开...

    AltiumDesigner拼板教程.zip

    拼板是将多个单独的电路板布局在一个大板上,以便于制造和组装,尤其适用于批量生产。 在PCB设计中,拼板有多种样式和技巧,如: 1. 各种形状板子拼板:这涉及到将不同形状的PCB布局组合在一起,如矩形、圆形或不...

    SMT拼板方法 PCB拼版设计

    SMT拼板是将多个独立的PCB小板通过特定的设计方式组合成一个大板,这样可以在同一时间进行批量贴装,提高生产速度,降低单个板的贴装成本。同时,拼板还能减少设备的调整时间和材料浪费,提高整体生产效率。 2. **...

    圆板拼板示范参考

    圆板拼板是一种特殊的PCB拼板方式,尤其适用于制作圆形或不规则形状的电路板。本教程将详细介绍圆板拼板的概念、应用场景及嘉立创公司的拼板服务,并结合“圆板拼板图”进行详细解析。 首先,圆板拼板主要是为了...

    PCB自动拼板开料系统

    用户可以通过运行这个程序来安装系统,实现自动化流程。在安装过程中,用户可能需要提供一些必要的信息,如安装路径、许可证密钥等,并遵循屏幕提示完成设置。安装完成后,系统将集成到生产流程中,通过与生产设备的...

Global site tag (gtag.js) - Google Analytics