安卓学习日记——画布与绘制

Android学习16——个人日记本 主要页面布局: activity_diary.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orient 阅读详情

先提一下Draw 9-patch
老版本的Android Studio是在SDK目录下的Tools里有个draw9patch
在这里插入图片描述
新版Android Studio是可以在AS里直接创建的(一开始没在目录下找到我也是一脸懵逼)
在这里插入图片描述
与传统的png格式图片相比,9.png格式图片在图片四周有一圈一个像素点组成的边沿,该边沿用于对图片的可扩展区和内容显示区进行定义。这种格式的图片在android环境下具有自适应调节大小的能力。
给.9图片划线,指的是通过划线,决定图片的可拉伸区域和显示文本信息的区域。其中,上方和左方的线是控制图片的可拉伸区域的,也就是说,上方的线控制图片横向可拉伸,左侧的线控制纵向可拉伸。下方的线和右侧的线控制图片的文本区域,也就是说,如果图片上有text,就会把位置控制在下方和右侧的线围成的区域里、如果想删除划线,安卓shift+鼠标左键,删除划线。

用画布画一个图片

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.View;

public class MyImageView extends View {
    public MyImageView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint p=new Paint();
        Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.x);
        canvas.drawBitmap(bitmap,0,0,p);

    }
}
setContentView(new MyImageView(this));

在这里插入图片描述
画2d图形

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Shader;
import android.os.Parcel;
import android.view.View;

/**
 * 自定义一个组件
 */
public class MyView extends View {
    public MyView(Context context) {
        super(context);
    }


    //会在组件加载时调用
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);
        Paint paint=new Paint();
        //去锯齿
        paint.setAntiAlias(true);
        //设置paint的颜色
        paint.setColor(Color.RED);
        //设置paint的style为STROKE:空心
        paint.setStyle(Paint.Style.STROKE);
        //设置paint的外框宽度
        paint.setStrokeWidth(3);
        //画一个空心圆形
        //参数:圆心X,圆心Y,半径r,paint
        canvas.drawCircle(40,40,30,paint);
        //画一个空心正方形
        //参数:left top right bottom,当right-left等于bottom-top就为正方形
        canvas.drawRect(10,90,70,150,paint);
        //画一个空心长方形
        canvas.drawRect(10,170,70,200,paint);
        //画一个空心椭圆形
        RectF re=new RectF(10,220,70,250);
        canvas.drawOval(re,paint);
        //画一个空心三角形
        Path path=new Path();
        path.moveTo(10,330);
        path.lineTo(70,330);
        path.lineTo(40,270);
        path.close();
        canvas.drawPath(path,paint);
        //画一个空心梯形
        Path path1=new Path();
        path1.moveTo(10,410);
        path1.lineTo(70,410);
        path1.lineTo(55,350);
        path1.lineTo(25,350);
        path1.close();
        canvas.drawPath(path1,paint);
        //设置paint的style为FILL:实心
        paint.setStyle(Paint.Style.FILL);
        //设置paint的颜色
        paint.setColor(Color.BLUE);
        //画一个实心圆
        canvas.drawCircle(120,40,30,paint);
        //画一个实心正方形
        canvas.drawRect(90,90,150,150,paint);
        //画一个实心长方形
        canvas.drawRect(90,170,150,200,paint);
        //画一个实心椭圆
        RectF re2=new RectF(90,220,150,250);
        canvas.drawOval(re2,paint);
        //画一个实心三角形
        Path path2=new Path();
        path2.moveTo(90,330);
        path2.lineTo(150,330);
        path2.lineTo(120,270);
        path2.close();
        canvas.drawPath(path2,paint);
        //画一个实心梯形
        Path path3=new Path();
        path3.moveTo(90,410);
        path3.lineTo(150,410);
        path3.lineTo(135,350);
        path3.lineTo(105,350);
        path3.close();
        canvas.drawPath(path3,paint);
        //设置渐变色
        Shader mShader=new LinearGradient(0,0,100,100,new int[]{
                    Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW
        },null,Shader.TileMode.REPEAT);
        paint.setShader(mShader);
        //画一个渐变色圆
        canvas.drawCircle(200,40,30,paint);
        //画一个渐变色正方形
        canvas.drawRect(170,90,230,150,paint);
        //画一个渐变色长方形
        canvas.drawRect(170,170,230,200,paint);
        //画一个渐变色椭圆
        RectF re3=new RectF(170,220,230,250);
        canvas.drawOval(re3,paint);
        //画一个渐变色三角形
        Path path4=new Path();
        path4.moveTo(170,330);
        path4.lineTo(230,330);
        path4.lineTo(200,270);
        path4.close();
        canvas.drawPath(path4,paint);
        //画一个渐变色梯形
        Path path5=new Path();
        path5.moveTo(170,410);
        path5.lineTo(230,410);
        path5.lineTo(215,350);
        path5.lineTo(185,350);
        path5.close();
        canvas.drawPath(path5,paint);
        //写字
        paint.setTextSize(24);
        canvas.drawText("圆形",240,50,paint);
        canvas.drawText("正方形",240,120,paint);
        canvas.drawText("长方形",240,190,paint);
        canvas.drawText("椭圆形",240,250,paint);
        canvas.drawText("三角形",240,320,paint);
        canvas.drawText("梯形",240,390,paint);
    }
}
setContentView(new MyView(this));

在这里插入图片描述
SurfaceView
单独在自己的窗口绘制

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder holder;
    private MyThread thread;
    public MySurfaceView(Context context) {
        super(context);
        holder=this.getHolder();
        holder.addCallback(this);
    }
    class MyThread implements Runnable{
        private SurfaceHolder holder;
        public boolean isRun;
    public MyThread(SurfaceHolder holder){
        this.holder=holder;
        isRun=true;
    }
        @Override
        public void run() {
        int count=0;

        while(isRun){
            Canvas canvas=null;
            try {
            synchronized (holder){
                canvas=holder.lockCanvas();
                canvas.drawColor(Color.BLACK);
                Paint p=new Paint();

                p.setColor(Color.RED);
                p.setAntiAlias(true);
                p.setStyle(Paint.Style.FILL);
                canvas.drawRect(10,10,100,100,p);
                p.setTextSize(30);
                canvas.drawText("当前是第 "+(count++)+" 秒",10,150,p);
                    Thread.sleep(1000);
            }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                holder.unlockCanvasAndPost(canvas);
            }
        }

        }
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        thread=new MyThread(holder);
        thread.isRun=true;
        new Thread(thread).start();
    }

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


    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        thread.isRun=false;

    }
}

在这里插入图片描述
SurfaceView播放视频

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

import java.io.IOException;

public class VideoActivity extends AppCompatActivity implements SurfaceHolder.Callback {
    private SurfaceView surfaceView;
    private SurfaceHolder holder;
    private MediaPlayer mp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);
        surfaceView=findViewById(R.id.surfaceView);
        holder=surfaceView.getHolder();
        holder.addCallback(this);
        holder.setFixedSize(320,220);
    }
    public void playClick(View view){
        mp.start();
    }
    public void pauseClick(View view){
        mp.pause();
    }
    public void stopClick(View view){
        mp.stop();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mp=new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setDisplay(holder);
        String path= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)+"/2.mp4";
        try {
            mp.setDataSource(path);//设置播放视频源
            mp.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if(mp!=null){
            if(mp.isPlaying()){
                mp.stop();
                mp.release();
            }
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mp!=null){
            if(mp.isPlaying()){
                mp.stop();
                mp.release();
            }
        }
    }
}

添加权限

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

在这里插入图片描述

从源码学习Android日记本应用开发 在移动应用领域,日记本软件为用户提供了一个记录日常生活点滴、规划目标和个人反思的空间。在Android平台上开发日记本软件需要考虑到其丰富的功能特性、用户体验设计以及数据持久化等多个方面。Material Design 是由 Google 推出的一套设计语言,旨在统一不同平台下的应用界面和交互体验。Material Design 设计原则包括视觉层次、丰富的运动、有意义的空白和对用户动作的直观响应。Material Design 提供了丰富的组件,如SnackbarCardView。 阅读详情

相关推荐

安卓日记本应用开发课程设计

在设计一款应用界面时,理念是最为重要的出发点。设计理念应该围绕用户需求、简洁易用和美观大方进行展开。一个清晰的设计理念能够帮助开发者和设计师在布局时做出正确的决策。以下是几个核心的设计理念:用户中心:应用的设计应以用户的实际需求为中心,考虑用户的使用习惯、操作便捷性和信息的易读性。简洁明了:界面元素应尽量简化,避免不必要的复杂性,让用户能够快速理解并进行操作。一致性:保持设计的一致性,包括颜色、字体、图标和布局等,使用户在不同页面间切换时有熟悉感。

weixin_35761094的博客 914

android画笔画布基本方法,android 画布,画笔,综合使用,可实现简单的画板

编写之前需要了解的知识点自定义 view画笔 paint路径 path画布 canvas别写这个的时候遇见好大的一个坑,就是使用canvas时,使用paint画笔具有透明度,每次都是调试不出来这个带透明的画笔,其实很简单的问题,让我疑惑了一天。以上就是我在编写的时候遇见的问题先上图,看一下带透明度的线 本节主要讲解最基础的部分private static final int INIT_PEN_WI...

weixin_32056343的博客 715

中移物联ML307C模组OPENCPU开发环境搭建全攻略

本文详细介绍了中移物联ML307C模组OPENCPU开发环境搭建的全过程。从OPENCPU模式的核心优势解析,到SDK获取、Python与scons工具安装,再到解读SDK目录结构与实战编译命令,最后提供常见问题避坑指南,帮助开发者快速构建高效的物联网应用编译环境。

weixin_29168393的博客 745

android 获取画布,Android硬件位图填坑之获取硬件画布 · Hiten’s Blog.

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?前言Hardware Bitmap(硬件位图)是Android8.0加入的新功能,通过设置Bitmap的config为Bitmap.Config.HARDWARE,创建所谓的Hardware Bitmap,它不同与其他Config的Bitmap,Hardware Bitmap对应的像素数据是存储在显存中,并对图片仅在屏幕...

weixin_42512103的博客 934

Qt多线程实战:如何优雅地处理Modbus设备通信中的线程安全问题

本文深入探讨了在Qt框架下实现Modbus设备通信时的多线程安全问题,提供了优雅的解决方案。通过生产者-消费者模型、任务队列与锁机制等设计模式,有效解决了界面卡顿、数据包错乱等问题。文章还详细介绍了对象生命周期管理、信号槽连接类型选择等关键实现细节,帮助开发者构建稳定可靠的Modbus通信模块。

weixin_30897233的博客 485

从模组到集装箱:手把手拆解一个储能BMS的软硬件架构设计与通信组网

本文深入解析储能BMS的软硬件架构设计与通信组网,从电芯采样到系统集成的全链条技术实现。详细介绍了三级硬件架构(AFE、CMU、BMU)的设计要点,以及软件分层实现中的驱动层、应用层核心算法和通信协议栈。通过实战案例分享CAN网络搭建、调试工具链和系统验证测试经验,为储能系统开发提供实用指导。

weixin_30752699的博客 464

android图形系统详解一:Canvas

概述   当写一个应用时,恰当的决定你的图形需求是很重要的.不同的图形任务对应不同的技术.例如,一个静态应用的图形和动画的实现肯定与一个交互式游戏非常不同.这里,我们将讨论一些在android上绘制图形时的操作以及它们最适合应用的任务. Canvas和Drawables   Android提供了一系列View部件来为大多数用户界面提供通常的功能.你也可以扩展这些部件来修改它们的外观和行...

mmdev 241

DIY一个SM2262ENG 2TB Nvme固态硬盘,慧荣SM2262EN主控

网友订做的 材料: 慧荣科技的62en,2片1G 三星DDR4缓存,4颗PF29F04T2AOCTH1,8CE B17A。SM2262EN属于慧荣第二代PCIe SSD主控,支持PCIe G3×4通道和全新的NVMe 1.3规范、8个NAND通道设计,并提供完整固件设计,最大循序读取速度高达3.5GB/s,循序写入速度达3.0GB/s,随机读写则高达420K IOPS和420K IOPS。此外,还采用目前最先进的低功耗设计,无论是在待机还是在工作状态下,均展现超低功耗,有效减少30%的功耗,满足用户追求超

m0_55207244的博客 1万+

【Android开发】图形图像处理技术-绘制图片

在Android中,Canvas类不仅可以绘制几何图形、文件和路径,还可以用来绘制图片。想要使用Canvas类绘制图片,只需要使用Canvas类提供的如下表所示的方法将Bitmap对象中保存的图片绘制到画布上即可。drawBitmap(Bitmap bitmap,Rect src,RectF dst,Paint paint) 用于从指定点绘制从源位图中...

weixin_34346099的博客 527

RK3588实战:如何将8路1080P视频流实时拼接成一张超清全景图?聊聊AVS模块的那些事

本文深入解析了RK3588芯片的AVS模块如何实现8路1080P视频流的实时全景拼接技术。通过硬件加速、时间同步、几何校正和色彩均衡等关键技术,RK3588能够高效处理高密度视频流,输出超清全景图。文章还提供了优化策略和实战经验,帮助开发者充分发挥RK3588的潜力。

weixin_27014595的博客 744

OpenClaw 超级 AI 实战专栏【模型推理与实战】(二)官方预训练模型下载与使用

OpenClaw 预训练模型需按「固定目录结构」存放(模型文件夹包含权重 + 配置文件),否则会加载失败;核心流程:下载模型→验证文件完整性→加载模型→传入图片执行推理→可视化结果;常见问题集中在「路径错误」「显存不足」「文件缺失」,按文中方案可快速解决。

qq_36130719的博客 307

android 添加画布,使用Android在画布上添加图像

我是androidjava的新手,经过长时间的在线研究,我真的不知道怎样让按钮出现在我的VIEW上.当我调试它时,我可以在布局中看到我的按钮而不是我的视图.我不确定如何在单击按钮后放入多个图像.如果我的代码中出错了,请纠正我.任何帮助将不胜感激.谢谢!我的代码如下:package com.example.oncanvas;import android.app.Activity;public cla...

weixin_42523907的博客 460

多周期路径约束(set_multicycle_path )

1.由慢到快的多周期约束 如下图所示,发射时钟周期是接受时钟周期的4倍。默认情况下,按照1T原则来进行静态时序分析和布局布线的。即建立时间是在发射沿后的第一个捕获沿检查,而保持时间是同一时刻下源时钟和捕获时钟的触发边沿下检查的(建立时间检查边沿的前一个触发沿)。 但是这样导致的问题就是该路径过于苛刻,为了满足这条路径的要求,不得不放弃其他路径。或者根本没办法保证这个默认的约束。总之最终造成...

Arist. 5506

安卓期末大作业——日记APP

2022/2023 学年 第 一 学期课程设计 实验报告模 块 名 称 Android课程设计专 业 通信工程(嵌入式培养)学 生 班 级学 生 学 号学 生 姓 名指 导 教 师1、 基本要求12、 安装与配置过程13、 调试过程及结果分析14、 体会11、 设计22、 实现方法23、 调试过程及结果分析24、 体会2。

科大云炬 1万+

【Docker安装】Ubuntu 24.04.2 LTS系统下安装Docker环境——指定APT源安装方式

【Docker安装】Ubuntu 24.04.2 LTS系统下安装Docker环境——指定APT源安装方式

jks212454的博客 625

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

安卓期末大作业(AndroidStudio开发),日记本app,代码注释详细,能正常运行

安卓期末大作业-日记本app(附下载链接) 压缩包内包含源代码,运行各个界面截图,一条日记可以记录2000字符以下的文本、最多8张配图和最多8个视频。每条日记都可以以评论的形式或转发引用的形式追更,评论的最大长度也是2000字符。日记还可以同时记录所处位置和当时的天气情况(当然,现在并不支持自动读取),可以为日记归类标签。其中只有日记文本是必填项,其他都是选填。主界面以时间倒序展示日记,可以无限下滑加载更多日记。你也可以搜索指定日记、按时间范围展示特定日记-按标签展示日记。最后,未写完的日记可以存储到草稿箱

weixin_43474701的博客 3万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android简单日记案例,android日记本实现源代码

【实例简介】android日记本实现源代码 自己写的 界面是丑了点 但是功能都还在 添加日记 修改日记 删除日记 日记加密(图形加密和数字加密)有兴趣的童鞋可以下载来看 欢迎扩展欢迎指导【实例截图】【核心代码】MyDiary└── MyDiary├── AndroidManifest.xml├── bin│ ├── AndroidManifest.xml│ ├── classes│ │...

weixin_32109109的博客 1854

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

西工大安卓大作业-日记本(源码+实验报告+问题总结)

西工大安卓大作业-日记本(源码+实验报告+问题总结) 去发现同类优质开源项目:https://gitcode.com/ 简介 本项目是西工大安卓课程的大作业,旨在综合运用基于android平台的智能移动终端软件开发技术,设计并实现了一款具备实际应用价值的智能移动终端软件应用——日记本。本软件应用包含了登录、查看日记列表、查看日记内容、搜索日记以及新建日记等多个相互关联的功能,用户界面友好,功能模块...

gitblog_06756的博客 867

基于Android的日记本系统的设计与实现

曾经我们习惯随身携带笔和纸完成灵感的记录,由于灵感繁多、户外写字不便等因素,灵感的即时管理变得难上加难,迫使人们寻找新的方式记录和管理灵感。科学技术日新月异的进步,让人类生活发生了巨大的变化,计算机技术的飞速发展,使各行各业在计算机技术应用方面得到了广泛的普及和使用。通过安装日记本软件,人们可以轻松的在手机上完成灵感的录入和管理,从传统的笔和纸中解放出来,提高效率,减少不必要的麻烦[4]。这些系统都提供了方便快捷的日记撰写、保存、查看和修改功能,并且支持多平台使用,如PC、手机、平板等。

m0_73268882的博客 953

项目大作业之日记本系统1

题目:       日记本系统 1          1 功能需求及技术可行性分析 日记本是我们从小到大一直在我们身边的好朋友,它记载着你的每一天,包括你的衣食住行,包含着你的喜怒哀乐,承载着你成长的气息。可以说,日记本是最了解你的“人”,它一直在默默倾听着你的心声。但是随着时间的流逝和科技的进步,纸质版的日记本已经不能满足于人们的需求,携带不方便,保密性差等缺点一点点的暴露出来,而我的这

qq_35612861的博客 1339

安卓开发学习日记第三天_新手怪button_莫韵乐的欢乐笔记

安卓开发学习日记第三天——按键的狂欢日 今天我们将会学习 编写第一个项目 玩转buttom 编写第一个项目 初识注册表 layout 触发事件 玩转button button参数 button样式 ...

莫韵乐的博客 861

西工大安卓大作业-日记本源码实验报告问题总结:功能与场景全面解读

西工大安卓大作业-日记本源码实验报告问题总结:功能与场景全面解读 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在数字化时代,日记不再是简单的纸笔记录,而是借助智能移动终端的便捷性,转变为一种高效、安全的记录方式。西工大安卓大作业-日记本便是在这样的背景下诞生的一款应用,它旨在通过Android平台,提供一种简单易用且功能丰富的日记记录工具。 项目技术分析 本项目深入...

gitblog_06729的博客 822

基于Android Studio的日记App课程设计

这篇文章将介绍一个课程设计项目的概述,以及系统模块的介绍和展示。首先,我们将介绍课程设计的背景和目的。在系统模块介绍部分,我们将展示系统的目录结构图,并详细讨论数据库的设计。接下来,我们将进行系统模块的测试,并分别测试用户认证模块、日记管理模块、清单管理模块和个人信息模块。在每个模块的测试中,我们将讨论测试方法和结果。最后,我们将展示一些代码片段,以展示系统的功能和实现细节。通过阅读本文,您将对该课程设计项目有一个全面的了解,包括系统架构、模块测试和代码示例。

topyacht的博客 2619

安卓APP开发日记1——名为Another的日记APP开发

很久很久以前就想做一个(很多个)APP,都是因为现在很多APP不是不能满足我的需求,就是满足我需求的方式不太符合我的感受。 以前也企图开发过很多次,但是最终都因为懒而虎头蛇尾,甚至没有看到一个能运行的界面。这次在开发的同时记录一下,或许能坚持下去。 这里有一个入门教程,看起来! 安装Andriod Studio什么的就不赘述了,现在安装已经非常简单。甚至模拟器都已经集成了。 试了一个例子,能跑通了。 然后发现样例里的一些东西,与教程里已经有出入了。毕竟这个发展太快,此时已经有Android 11了。不紧跟,

karishima的博客 1374

android 日记 app推荐,用这些 APP 来记录生活,再也不用担心无法坚持写日记

原标题:用这些 APP 来记录生活,再也不用担心无法坚持写日记新年新气象?总想立一些 flag ,比如坚持写日记?「唉,算了吧,小学那个狂编几十篇日记的开学前夜实在是给我留下了心理阴影……」喂,朋友,醒醒,这9012年都到了,写日记早就不是你记忆中那个样子了,今天我要安利的这些记录生活的 APP ,或有趣,或简约,保证你可以轻轻松松地养成写日记这个习惯。▎共享日记代表产品:你的日记( iOS &a...

weixin_42525353的博客 1561

SQLite学习实例, 日记本

这是一个简单的android日记程序, 按下菜单栏后, 会出现添加新日记和删除日记两项, 点击主页面的日记可以直接编辑日记 整个程序分成三个文件, 主程序逻辑是ActivityMain.java, 编辑逻辑是ActivityDiaryEdit.java, 还有一个DiaryDbAdapter.java文件定义了一个DiaryDbAdapter类, 封装数据库的操作. 以下是ActivityM

BHduke的专栏 1992
上一篇: 安卓学习日记——补间动画与帧动画
下一篇: 安卓学习日记——Bitmaps与优化
chen_xiaoke
博客等级 码龄8年 32粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值