笔记20170415--一个简单的九宫格(Android)

需求:

服务器上获取数据,在一个列表上显示数据相对应的颜色(这个列表不是笔记的重点),列表用GridView实即可,点击item,这个item可以变换颜色!重点是这个列表对应一个缩略图,同样要匹配颜色,并且在GridView点击某个item更换这个item颜色的时候,缩略图上所对应的小格子也要变换颜色!

要达到的效果(笔记的重点是下边的那个“缩略图”的实现)

1.jpg

代码如下:

package xxx.xxx.xxx.xxx.customView;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.View;

import xxx.xxx.xxx.R;

/**
 * Created by Hello我的World on 2017/4/15.
 */

public class CustomSudokuView extends View {

    private int[] colors;
    private int line_color;
    private Paint mPaint;
    private int index0,index1,index2,index3,index4,index5,index6,index7,index8;

    public CustomSudokuView(Context context) {
        this(context,null);
    }

    public CustomSudokuView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomSudokuView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        colors =new int[]{ContextCompat.getColor(context, R.color.options_grey),ContextCompat.getColor(context,R.color.options_yellow),ContextCompat.getColor(context,R.color.options_white)};
        line_color = ContextCompat.getColor(context,R.color.sudoku_line);
        index0 = colors[0];
        index1 = colors[0];
        index2 = colors[0];
        index3 = colors[0];
        index4 = colors[0];
        index5 = colors[0];
        index6 = colors[0];
        index7 = colors[0];
        index8 = colors[0];

        mPaint = new Paint();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float lineT =1 ;
        float pW = (getMeasuredWidth()-lineT*4)/3;
        float pH = (getMeasuredHeight()-lineT*4)/3;

        //第一跟横着的线
        mPaint.setColor(line_color);
        canvas.drawRect(0,0,getMeasuredWidth(),lineT,mPaint);

        //第一行第一根竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(0,lineT,lineT,pH+lineT,mPaint);

        //第一行第一个方块
        mPaint.setColor(index0);
        canvas.drawRect(lineT,lineT,pW+lineT,pH+lineT,mPaint);

        //第一行第二个竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(pW+lineT,lineT,pW+lineT+lineT,pH+lineT,mPaint);

        //第一行第二个方块
        mPaint.setColor(index1);
        canvas.drawRect(pW+lineT+lineT,lineT,pW*2+lineT*2,pH+lineT,mPaint);

        //第一行第三个竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(pW*2+lineT*2,lineT,pW*2+lineT*2+lineT,pH+lineT,mPaint);

        //第一行第三个方块
        mPaint.setColor(index2);
        canvas.drawRect(pW*2+lineT*2+lineT,lineT,pW*3+lineT*3,pH+lineT,mPaint);

        //第一行第四根竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(pW*3+lineT*3,lineT,pW*3+lineT*4,pH+lineT,mPaint);

        //第二根横着的线
        mPaint.setColor(line_color);
        canvas.drawRect(0,pH+lineT,pW*3+lineT*4,pH+lineT+lineT,mPaint);

        //第二行第一个竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(0,pH+lineT+lineT,lineT,pH*2+lineT*2,mPaint);

        //第二行第一个方块
        mPaint.setColor(index3);
        canvas.drawRect(lineT,pH+lineT+lineT,pW+lineT,pH*2+lineT*2,mPaint);

        //第二行第二个竖线
        mPaint.setColor(line_color);
        canvas.drawRect(pW+lineT,pH+lineT+lineT,pW+lineT+lineT,pH*2+lineT*2,mPaint);

        //第二行第二个方块
        mPaint.setColor(index4);
        canvas.drawRect(pW+lineT+lineT,pH+lineT+lineT,pW*2+lineT*2,pH*2+lineT*2,mPaint);

        //第二行第三个竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(pW*2+lineT*2,pH+lineT+lineT,pW*2+lineT*2+lineT,pH*2+lineT*2,mPaint);

        //第二行第三个方块
        mPaint.setColor(index5);
        canvas.drawRect(pW*2+lineT*2+lineT,pH+lineT+lineT,pW*3+lineT*3,pH*2+lineT*2,mPaint);

        //第二行第四条竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(pW*3+lineT*3,pH+lineT+lineT,pW*3+lineT*4,pH*2+lineT*2,mPaint);

        //第三条横着的线
        mPaint.setColor(line_color);
        canvas.drawRect(0,pH*2+lineT*2,pW*3+lineT*4,pH*2+lineT*3,mPaint);

        //第三行第一条竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(0,pH*2+lineT*3,lineT,pH*3+lineT*3,mPaint);

        //第三行第一个方块
        mPaint.setColor(index6);
        canvas.drawRect(lineT,pH*2+lineT*3,pW+lineT,pH*3+lineT*3,mPaint);

        //第三行第二条竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(pW+lineT,pH*2+lineT*3,pW+lineT+lineT,pH*3+lineT*3,mPaint);

        //第三行第二个方块
        mPaint.setColor(index7);
        canvas.drawRect(pW+lineT+lineT,pH*2+lineT*3,pW*2+lineT*2,pH*3+lineT*3,mPaint);

        //第三行第三条竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(pW*2+lineT*2,pH*2+lineT*3,pW*2+lineT*2+lineT,pH*3+lineT*3,mPaint);

        //第三行第三个方块
        mPaint.setColor(index8);
        canvas.drawRect(pW*2+lineT*2+lineT,pH*2+lineT*3,pW*3+lineT*3,pH*3+lineT*3,mPaint);

        //第三行第四条竖着的线
        mPaint.setColor(line_color);
        canvas.drawRect(pW*3+lineT*3,pH*2+lineT*3,pW*3+lineT*4,pH*3+lineT*3,mPaint);

        //第四条横着的线
        mPaint.setColor(line_color);
        canvas.drawRect(0,pH*3+lineT*3,pW*3+lineT*4,pH*3+lineT*4,mPaint);
    }

    public void setColorForPosition(int viewIndex,int colorIndex){
        switch (viewIndex){
            case 0:
                switch (colorIndex){
                    case 0:
                    case 1:
                    case 2:
                        index0 = colors[colorIndex];
                        break;
                    default:
                        index0 = colors[0];
                        break;
                }
                break;
            case 1:
                switch (colorIndex){
                    case 0:
                    case 1:
                    case 2:
                        index1 = colors[colorIndex];
                        break;
                    default:
                        index1 = colors[0];
                        break;
                }
                break;
            case 2:
                switch (colorIndex){
                    case 0:
                    case 1:
                    case 2:
                        index2 = colors[colorIndex];
                        break;
                    default:
                        index2 = colors[0];
                        break;
                }
                break;
            case 3:
                switch (colorIndex){
                    case 0:
                    case 1:
                    case 2:
                        index3 = colors[colorIndex];
                        break;
                    default:
                        index3 = colors[0];
                        break;
                }
                break;
            case 4:
                switch (colorIndex){
                    case 0:
                    case 1:
                    case 2:
                        index4 = colors[colorIndex];
                        break;
                    default:
                        index4 = colors[0];
                        break;
                }
                break;
            case 5:
                switch (colorIndex){
                    case 0:
                    case 1:
                    case 2:
                        index5 = colors[colorIndex];
                        break;
                    default:
                        index5 = colors[0];
                        break;
                }
                break;
            case 6:
                switch (colorIndex){
                    case 0:
                    case 1:
                    case 2:
                        index6 = colors[colorIndex];
                        break;
                    default:
                        index6 = colors[0];
                        break;
                }
                break;
            case 7:
                switch (colorIndex){
                    case 0:
                    case 1:
                    case 2:
                        index7 = colors[colorIndex];
                        break;
                    default:
                        index7 = colors[0];
                        break;
                }
                break;
            case 8:
                switch (colorIndex){
                    case 0:
                    case 1:
                    case 2:
                        index8 = colors[colorIndex];
                        break;
                    default:
                        index8 = colors[0];
                        break;
                }
                break;
            default:
                break;
        }
    }
}

xml中

<xxx.xxx.xxx.xxx.xxx.CustomSudokuView
    android:id="@+id/sudokuView"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_centerVertical="true"/>

使用

public class MainActivity extends AppCompatActivity {
    CustomSudokuView view;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        view = (CustomSudokuView ) findViewById(R.id.sudokuView);
        
        view.setColorForPosition(0, 0);//后边的这个参数取值是0-2
        view.setColorForPosition(1, 1);
        view.setColorForPosition(2, 2);
        view.setColorForPosition(3, 0);
        view.setColorForPosition(4, 1);
        view.setColorForPosition(5, 2);
        view.setColorForPosition(6, 0);
        view.setColorForPosition(7, 1);
        view.setColorForPosition(8, 2);
        view.postInvalidate();
    }
}

实现思路:

继承View,这样的话写完就是一个单独的控件了,不会包含多层控件。

  • 有3种颜色:
    private int[] colors;
  • 有9个格子,所以要有9个格子所用到的颜色变量
    private int index0,index1,index2,index3,index4,index5,index6,index7,index8;
  • 有格子的边框线的颜色
    private int line_color;
  • 画笔
    private Paint mPaint;
  • 构造方法 CustomSudokuView()
    构造方法中给上述的变量赋值
  • 绘制方法 onDraw()
    我们有3行3列格子,横竖各4条线,竖线我是分割开来做的,整体思路是:
    第一条横线,
    第一条横线下边是第一行格子和竖线:第1行第一个竖线,第1行第一个格子,第1行第二条竖线,第1行第二个格子,第1行第三条竖线,第1行 第三个格子,第1行第四条竖线,
    然后下边是第二条横线,
    第二条横线下边是第二行格子和竖线,同第一行格子和竖线
    然后下边是第三条横线,
    第三条横线下边是第三行格子和竖线,同第一二行格子和竖线
    最下边是第四条横线
    确定好思路后,就要开始画了,在画之前,有三个参数要确定下 :代表线的变量(lineT),格子的宽(pW),格子的高(pH)
    每行有3个格子,4条竖线,那么每个格子宽度就是“控件宽度减去4条竖线的宽度除以3”
    每列有3个格子,4条横线,那么每个格子的高度就是“控件高度减去4条横线的高度除以3”
    确定好之后就愉快的画吧,没有用drawLine()方法,直接用的drawRect()方法把线也当成矩形画了。
  • 设置哪个格子什么颜色的方法 setColorForPosition(int viewIndex,int colorIndex)
    这个方法是给外部调用的,参数viewIndex是指哪个格子,colorIndex是指哪个颜色,整个方法的功能是将第viewIndex个个子的颜色设置成colors[colorIndex],例如我想将第一个格子设置成黄色,只需要在外部调用
    view.setColorForPosition(0,1)即可

以上是这个九宫格的笔记!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,719评论 0 33
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,386评论 25 707
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 那是一个照常的工作日,我还在忙碌的整理资料,铃铃铃,电话声又想起来,简单沟通下就草草的留了个联系方式,晕,客户太多...
    Aalizzwell_15fc阅读 562评论 0 0
  • 上大学时,就听说过《思考致富》是一本好书。后来到部队时,发现战友有一本,就向他借来读。再后来就要求他送给了我...
    平和世界阅读 3,645评论 3 10