Android 365存錢法 心形自定義View實現(xiàn)

因為數(shù)據(jù)比較多猾漫,是22*25的,所以手機上比較擠:


b4ecf83ebf62decad48ea827d4df56e.jpg

感覺最麻煩的就是數(shù)據(jù)感凤,程序員的惰性思維告訴我可以使用for循環(huán)填充悯周,但是愚笨的大腦沒找到實現(xiàn)的方式,就一點點手打了:


image.png

沒有辦法陪竿,我就是這么強大(dog)

接下來就是自定義View的實現(xiàn)過程:

public class Heart365View extends View {

    private int[][] array   = null;
    private int     width   = 0;
    private int     height  = 30;
    private int     padding = 0;
    private Paint   boxPaint, textPaint, bitmapPaint, backPaint;
    private Bitmap        heartBitmap;
    private List<Integer> list = new ArrayList<>();

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

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

    public Heart365View(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    //初始化畫筆 和 寬度 和數(shù)據(jù)庫數(shù)據(jù)
    private void init() {
        array = HeartArray.getArrays();
        backPaint = new Paint();
        backPaint.setColor(Color.parseColor("#FFC0CB"));
        boxPaint = new Paint();
        boxPaint.setColor(Color.parseColor("#FA8072"));
        textPaint = new Paint();
        textPaint.setColor(Color.parseColor("#2595e4"));
        textPaint.setTextSize(15);
        bitmapPaint = new Paint();
        heartBitmap = Utils.drawable2Bitmap(getContext().getResources().getDrawable(R.mipmap.heart));
        list.addAll(SqlUtils.getInstance(getContext()).getAllData());
        initBoxWidth();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //循環(huán)渲染界面
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                int num = array[i][j];
                //大于0的是正常天數(shù)
                if (num > 0) {
                    //這條數(shù)據(jù)是否需要渲染背景禽翼,也就是有沒有存過
                    boolean exists = list.indexOf(num) != -1;
                    //如果數(shù)據(jù)存在,就畫背景
                    if (exists)
                        canvas.drawRect(j * width + padding, i * height, (j + 1) * width + padding, (i + 1) * height, backPaint);
                    //上方橫線
                    canvas.drawLine(j * width + padding, i * height, (j + 1) * width + padding, i * height, boxPaint);
                    //左豎
                    canvas.drawLine(j * width + padding, i * height, j * width + padding, (i + 1) * height, boxPaint);
                    //下方橫線
                    canvas.drawLine((j + 1) * width + padding, i * height, (j + 1) * width + padding, (i + 1) * height, boxPaint);
                    //右豎
                    canvas.drawLine(j * width + padding, (i + 1) * height, (j + 1) * width + padding, (i + 1) * height, boxPaint);
                    //畫文字
                    canvas.drawText(num + "", (j * width) + getPaddingLR(num + "") + padding, ((i + 1) * height) - 10, textPaint);
                } else if (num < 0) {
                    //畫心
                    canvas.drawBitmap(heartBitmap, (j * width) + padding, (i) * height + 1, bitmapPaint);
                }
            }
        }
    }

    //新增天數(shù) 刷新界面
    public void update(int i) {
        list.add(i);
        invalidate();
    }


    //初始化每一格的寬度
    void initBoxWidth() {
        int windowWidth = Utils.getWindowWidth(getContext());
        width = (windowWidth) / (array[0].length);
        padding = (windowWidth - (width * array[0].length)) / 2;
        Log.e("yxs", "獲取屏幕寬度:" + windowWidth + "---" + width + "---" + array[0].length + "----" + padding);
    }

    //使數(shù)組居中族跛,計算Padding
    int getPaddingLR(String s) {
        switch (s.length()) {
            case 1:
                return 12;
            case 2:
                return 6;
            case 3:
                return 2;
        }
        return 0;
    }

}

數(shù)據(jù)庫操作:

public class SqlUtils extends SQLiteOpenHelper {
    private        SQLiteDatabase database;
    private        Cursor         cursor;
    private static SqlUtils       utils;

    public static SqlUtils getInstance(Context c) {
        if (utils == null)
            utils = new SqlUtils(c);
        return utils;
    }

    public SqlUtils(@Nullable Context context) {
        super(context, "heart.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table if not exists h(_id integer primary key autoincrement , num integer)");
    }

    public boolean add(int i) {
        if (isExists(i)) {
            Utils.showToast("數(shù)據(jù)已存在~");
            return false;
        } else {
            database = getDatabase();
            database.execSQL("insert into h (num) values(?)", new String[]{i + ""});
            return true;
        }
    }

    public boolean isExists(int i) {
        database = getDatabase();
        cursor = database.rawQuery("select * from h where num=?", new String[]{i + ""});
        return cursor.moveToFirst();
    }

    public List<Integer> getAllData() {
        database = getDatabase();
        cursor = database.rawQuery("select * from h", new String[]{});
        List<Integer> list = new ArrayList<>();
        while (cursor.moveToNext()) {
            int i = cursor.getInt(cursor.getColumnIndex("num"));
            Log.e("yxs", "讀取數(shù)據(jù):" + i);
            list.add(i);
        }
        return list;
    }

    public SQLiteDatabase getDatabase() {
        if (database == null)
            database = getWritableDatabase();
        return database;
    }

    public void close() {
        if (cursor != null)
            cursor.close();
        if (database != null)
            database.close();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

使用方法闰挡,xml直接調(diào)用自定義View,Activity:

public class MainActivity extends AppCompatActivity {

    private Heart365View heartView;
    private SqlUtils     sqlUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        heartView = findViewById(R.id.Heart);
        final EditText ed = findViewById(R.id.Ed);
        sqlUtils = SqlUtils.getInstance(this);
        findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int i = Integer.parseInt(ed.getText().toString());
                if (sqlUtils.add(i)) {
                    heartView.update(i);
                }
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        sqlUtils.close();
    }
}

點個贊哦親礁哄,我太難了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末长酗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子桐绒,更是在濱河造成了極大的恐慌夺脾,老刑警劉巖之拨,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咧叭,居然都是意外死亡蚀乔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門菲茬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吉挣,“玉大人,你說我怎么就攤上這事婉弹√耄” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵马胧,是天一觀的道長汉买。 經(jīng)常有香客問我,道長佩脊,這世上最難降的妖魔是什么蛙粘? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮威彰,結(jié)果婚禮上出牧,老公的妹妹穿的比我還像新娘。我一直安慰自己歇盼,他們只是感情好舔痕,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豹缀,像睡著了一般伯复。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邢笙,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天啸如,我揣著相機與錄音,去河邊找鬼氮惯。 笑死叮雳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的妇汗。 我是一名探鬼主播帘不,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杨箭!你這毒婦竟也來了寞焙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤告唆,失蹤者是張志新(化名)和其女友劉穎棺弊,沒想到半個月后晶密,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡模她,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年稻艰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侈净。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡尊勿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畜侦,到底是詐尸還是另有隱情元扔,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布旋膳,位于F島的核電站澎语,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏验懊。R本人自食惡果不足惜擅羞,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望义图。 院中可真熱鬧减俏,春花似錦、人聲如沸碱工。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怕篷。三九已至历筝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匙头,已是汗流浹背漫谷。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工仔雷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹂析,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓碟婆,卻偏偏與公主長得像电抚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子竖共,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容