07_Android操作sqllite数据库(包括2中方式操作数据的方式),单元测试,BaseAdapter的使用,自定义view的综合使用案例

简介: 1 目标从sqllite中读取数据并显示如下:MainActivity对应的界面 MainActivity2对应的界面           2  配置Android的清单文件 <?xml version="1.0" encoding="utf-8"?> <manifest xm


1 目标从sqllite中读取数据并显示如下:

MainActivity对应的界面


MainActivity2 对应的界面           

2  配置Android的清单文件

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.itheima28.sqlitedemo"

    android:versionCode="1"

    android:versionName="1.0" >

   

    <instrumentation

        android:name="android.test.InstrumentationTestRunner"

        android:targetPackage="com.itheima28.sqlitedemo">

    </instrumentation>

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="19" />

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <uses-library android:name="android.test.runner"/>

       

        <!--

            运行的时候改变 com.itheima28.sqlitedemo.MainActivity

            com.itheima28.sqlitedemo.MainActivity2来显示不同的界面

        -->

        <activity

            android:name="com.itheima28.sqlitedemo.MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

</manifest>

3  编写操作数据库用的工具PersonSQLiteOpenHelper

package com.itheima28.sqlitedemo.db;

 

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.util.Log;

 

/**

 * 数据库帮助类,用于创建和管理数据库

 * @author toto

 */

public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {

         private static final String TAG = "PersonSQLiteOpenHelper";

 

         /**

          * 数据库的构造函数

          * @param context

          *

          * name 数据库名称

          * factory 游标工程

          * version 数据库的版本号   不可以小于1

          */

         public PersonSQLiteOpenHelper(Context context) {

                   //Open Declaration android.database.sqlite.SQLiteOpenHelper.SQLiteOpenHelper(

                   //                                         Context context,

                   //                                         String name,

                   //                                         CursorFactory factory,

                   //                                         int version)

                   super(context, "itheima28.db", null, 1);

         }

 

         /**

          * 数据库第一次创建时回调此方法

          * 初始化

          */

         @Override

         public void onCreate(SQLiteDatabase db) {

                   //操作数据库

                   String sql = "create table person(_id integer primary key, name varchar(20), age integer);";

                   db.execSQL(sql);

         }

 

         /**

          * 数据库的版本号更新时回调此方法,

          * 更新数据库的内容(删除表,添加表,修改表)

          */

         @Override

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

                   if (oldVersion == 1 && newVersion == 2) {

                            Log.i(TAG, "数据库更新啦");

                            //person表中添加一个余额列balance

                            db.execSQL("alter table person add balance integer;");

                   }

         }

        

}

4 编写Person实体

package com.itheima28.sqlitedemo.entities;

 

public class Person {

 

    private int id;

    private String name;

    private int age;

    public int getId() {

       return id;

    }

    public void setId(int id) {

       this.id = id;

    }

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

    public int getAge() {

       return age;

    }

    public void setAge(int age) {

       this.age = age;

    }

    public Person() {

       super();

    }

    public Person(int id, String name, int age) {

       super();

       this.id = id;

       this.name = name;

       this.age = age;

    }

    @Override

    public String toString() {

       return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";

    }

}

5第一种直接通过sql的方式操作数据库:

package com.itheima28.sqlitedemo.dao;

 

import java.util.ArrayList;

import java.util.List;

 

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

 

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

 

public class PersonDao {

         //数据库的帮助类对象

         private PersonSQLiteOpenHelper mOpenHelper;

        

         public PersonDao(Context context) {

                   mOpenHelper = new PersonSQLiteOpenHelper(context);

         }

        

         /**

          * 添加到person表一条数据库

          * @param person

          */

         public void insert(Person person) {

                   SQLiteDatabase db = mOpenHelper.getWritableDatabase();

                   //如果数据库打开,执行添加的操作

                   if (db.isOpen()) {

                            //执行添加到数据库的操作

                            db.execSQL("insert into person(name,age) values(?,?);",new Object[]{

                                               person.getName(),

                                               person.getAge()

                            });

                           

                            //数据库关闭

                            db.close();

                   }

         }

        

         /**

          * 根据id删除记录

          * @param id

          */

         public void delete(int id) {

                   SQLiteDatabase db = mOpenHelper.getWritableDatabase();

                   //如果数据库打开,执行添加的操作

                   if (db.isOpen()) {

                            db.execSQL("delete from person where _id = ?;",new Integer[]{id});

                           

                            //数据库关闭

                            db.close();

                   }

         }

        

         /**

          * 根据id找到记录,并且修改姓名

          * @param id

          * @param name

          */

         public void update(int id,String name) {

                   SQLiteDatabase db = mOpenHelper.getWritableDatabase();

                   //如果数据库打开,执行添加的操作

                   if (db.isOpen()) {

                            db.execSQL("update person set name = ? where _id = ?;",new Object[]{name,id});

                           

                            //数据库关闭

                            db.close();

                   }

         }

        

         /**

          * 查询所有

          * @return

          */

         public List<Person> queryAll() {

                   SQLiteDatabase db = mOpenHelper.getReadableDatabase();

                   if (db.isOpen()) {

                            Cursor cursor = db.rawQuery("select _id, name, age from person;", null);

                           

                            if (cursor != null && cursor.getCount() > 0) {

                                     List<Person> personList = new ArrayList<Person>();

                                     int id;

                                     String name;

                                     int age;

                                     while (cursor.moveToNext()) {

                                               id = cursor.getInt(0);        //取到第0列的数据id

                                               name = cursor.getString(1);   //取姓名

                                               age = cursor.getInt(2);

                                               personList.add(new Person(id,name,age));

                                     }

                                    

                                     cursor.close();

                                     db.close();

                                     return personList;

                            }

                            db.close();

                   }

                   return null;

         }

        

         /**

          * 根据id查询人

          * @param id

          * @return

          */

         public Person queryItem(int id) {

                   SQLiteDatabase db = mOpenHelper.getReadableDatabase();       // 获得一个只读的数据库对象

                   if(db.isOpen()) {

                            Cursor cursor = db.rawQuery("select _id, name, age from person where _id = ?;", new String[]{id + ""});

                            if(cursor != null && cursor.moveToFirst()) {

                                     int _id = cursor.getInt(0);

                                     String name = cursor.getString(1);

                                     int age = cursor.getInt(2);

 

                                     cursor.close();

                                     db.close();

                                     return new Person(_id, name, age);

                            }

                            db.close();

                   }

                   return null;

         }

}

6 第二种操作数据库的方式

package com.itheima28.sqlitedemo.dao;

 

import java.util.ArrayList;

import java.util.List;

 

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.util.Log;

 

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

 

/**

 * 不使用SQL的方式进行操作

 * @author toto

 */

public class PersonDao2 {

         private static final String TAG = "PersonDao2";

         //数据库的帮助类对象

         private PersonSQLiteOpenHelper mOpenHelper;

        

         public PersonDao2(Context context) {

                   mOpenHelper = new PersonSQLiteOpenHelper(context);

         }

        

         /**

          * 添加到person表一条数据

          * @param person

          */

         public void insert(Person person) {

                   SQLiteDatabase db = mOpenHelper.getWritableDatabase();

                   //如果数据库打开,执行添加的操作

                   if (db.isOpen()) {

                            ContentValues values = new ContentValues();

                            //key作为要存储的列名,value对象列的值

                            values.put("name", person.getName());

                            values.put("age", person.getAge());

                            long id = db.insert("person", "name", values);

                            Log.i(TAG, "id:" + id);

                           

                            //数据库关闭

                            db.close();

                   }

         }

        

         /**

          * 根据id删除记录

          */

         public void delete(int id) {

                   //获得可写的数据库对象

                   SQLiteDatabase db = mOpenHelper.getWritableDatabase();

                   //如果数据库打开,执行添加的操作

                   if (db.isOpen()) {

                            String whereClause = "_id = ?";

                            String[] whereArgs = {id + ""};

                            int count = db.delete("person", whereClause, whereArgs);

                            Log.i(TAG,"删除了:" + count + "");

                            //数据库关闭

                            db.close();

                   }

         }

        

         /**

          * 根据id找到记录,并且修改姓名

          * @param id

          * @param name

          */

         public void update(int id,String name) {

                   SQLiteDatabase db = mOpenHelper.getWritableDatabase();

                   //如果数据库打开,执行添加的操作

                   if (db.isOpen()) {

                            ContentValues values = new ContentValues();

                            values.put("name", name);

                           

                            int count = db.update("person", values, "_id = ?", new String[]{id + ""});

                            Log.i(TAG, "修改了:" + count + "");

                            //数据库关闭

                            db.close();

                   }

         }

        

         /**

          * 查询所有的结果集

          * @return

          */

         public List<Person> queryAll() {

                   // 获得一个只读的数据库对象

                   SQLiteDatabase db = mOpenHelper.getReadableDatabase();      

                   if(db.isOpen()) {

                            // 需要的列

                            String[] columns = {"_id", "name", "age"};    

                            // 选择条件, null查询所有

                            String selection = null;

                            // 选择条件的参数, 会把选择条件中的? 替换成数据中的值

                            String[] selectionArgs = null;

                            // 分组语句  group by name                                  

                            String groupBy = null;                                      

                            // 过滤语句                                                 

                            String having = null;                                       

                            // 排序                                                     

                            String orderBy = null;

                           

                            Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);

                           

                            int id;

                            String name;

                            int age;

                            if(cursor != null && cursor.getCount() > 0) {

                                     List<Person> personList = new ArrayList<Person>();

                                    

                                     while(cursor.moveToNext()) { 

                                               // 向下移一位, 知道最后一位, 不可以往下移动了,停止.

                                               id = cursor.getInt(0);

                                               name = cursor.getString(1);

                                               age = cursor.getInt(2);

                                              

                                               personList.add(new Person(id, name, age));

                                     }

                                    

                                     cursor.close();

                                     db.close();

                                     return personList;

                            }

                            db.close();

                   }

                   return null;

         }

        

         /**

          * 根据id查询人

          * @param id

          * @return

          */

         public Person queryItem(int id) {

                   // 获得一个只读的数据库对象

                   SQLiteDatabase db = mOpenHelper.getReadableDatabase();

                   if(db.isOpen()) {

                            // 需要的列

                            String[] columns = {"_id", "name", "age"};

                            // 选择条件, null查询所有

                            String selection = "_id = ?";

                            // 选择条件的参数, 会把选择条件中的? 替换成数据中的值

                            String[] selectionArgs = {id + ""};

                            // 分组语句  group by name

                            String groupBy = null;

                            // 过滤语句

                            String having = null;

                            // 排序

                            String orderBy = null;

                           

                            Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);

                           

                            // cursor对且象不为null, 并可以移动到第一行

                            if(cursor != null && cursor.moveToFirst()) {

                                     int _id = cursor.getInt(0);

                                     String name = cursor.getString(1);

                                     int age = cursor.getInt(2);

 

                                     cursor.close();

                                     db.close();

                                     return new Person(_id, name, age);

                            }

                            db.close();

                   }

                   return null;

         }

        

}

7 TestCase才是personDao,注意项目中是通过单元测试来添加数据的

package com.itheima28.sqlitedemo.test;

 

import java.util.List;

 

import android.database.sqlite.SQLiteDatabase;

import android.test.AndroidTestCase;

import android.util.Log;

 

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

 

public class TestCase extends AndroidTestCase{

 

         private static final String TAG = "TestCase";

        

         public void test() {

                   //数据库什么时候创建

                   PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

                  

                   //第一次连接数据库时创建数据库文件  .onCreate会被调用

                   openHelper.getReadableDatabase();

         }

        

         /**

          * 向数据库中插入一条数据

          */

         public void testInsert() {

                   PersonDao dao = new PersonDao(getContext());

             dao.insert(new Person(0,"田七",28));

         }

        

         /**

          * 删除数据

          */

         public void testDelete() {

                   PersonDao dao = new PersonDao(getContext());

                   dao.delete(1);

         }

        

         /**

          * 更新数据

          */

         public void testUpdate() {

                   PersonDao dao = new PersonDao(getContext());

                   dao.update(3, "李四");

         }

        

         /**

          * 查询所有的列表信息

          */

         public void testQueryAll() {

                   PersonDao dao = new PersonDao(getContext());

                   List<Person> personList = dao.queryAll();

                  

                   for (Person person : personList) {

                            Log.i(TAG, person.toString());

                   }

         }

        

         /**

          * 查询条项

          */

         public void testQueryItem() {

                   PersonDao dao = new PersonDao(getContext());

                   Person person = dao.queryItem(4);

                   Log.i(TAG, person.toString());

         }

        

         /**

          * 事务操作

          */

         public void testTransaction() {

                   PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

                   SQLiteDatabase db = openHelper.getWritableDatabase();

                  

                   if (db.isOpen()) {

                            try {

                                     //开启事务

                                     db.beginTransaction();

                                    

                                     //1.从张三账户中扣1000块钱

                                     db.execSQL("update person set balance = balance - 1000 where name = 'zhangsan';");

                                    

                                     //ATM机,挂掉了

                                     //int result = 10 / 0;

                                    

                                     //2.向李四账户中加1000块钱

                                     db.execSQL("update person set balance = balance + 1000 where name = 'lisi';");

                                    

                                     //标记事务成功

                                     db.setTransactionSuccessful();

                            } finally {

                                     //停止事务

                                db.endTransaction();       

                            }

                            db.close();

                   }

         }

}

数据库截图如下:

8 TestCase2测试第二种方式操作数据库

package com.itheima28.sqlitedemo.test;

 

import java.util.List;

 

import com.itheima28.sqlitedemo.dao.PersonDao2;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

 

import android.test.AndroidTestCase;

import android.util.Log;

 

public class TestCase2 extends AndroidTestCase {

 

         private static final String TAG = "TestCase";

        

         public void test() {

                   //数据库什么时候创建

                   PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

                  

                   //第一次连接数据库时创建数据库文件   onCreate会被调用

                   openHelper.getReadableDatabase();

         }

        

         /**

          * 添加

          */

         public void testInsert() {

                   PersonDao2 dao = new PersonDao2(getContext());

                   dao.insert(new Person(0, "zhouqi", 88));

         }

        

         public void testDelete() {

                   PersonDao2 dao = new PersonDao2(getContext());

                   dao.delete(8);

         }

 

         public void testUpdate() {

                   PersonDao2 dao = new PersonDao2(getContext());

                   dao.update(3, "fengjie");

         }

 

         public void testQueryAll() {

                   PersonDao2 dao = new PersonDao2(getContext());

                   List<Person> personList = dao.queryAll();

                  

                   for (Person person : personList) {

                            Log.i(TAG, person.toString());

                   }

         }

 

         public void testQueryItem() {

                   PersonDao2 dao = new PersonDao2(getContext());

                   Person person = dao.queryItem(4);

                   Log.i(TAG, person.toString());

         }

}

9 MainActivity的代码如下:

package com.itheima28.sqlitedemo;

 

import java.util.List;

 

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ListView;

import android.widget.TextView;

 

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.entities.Person;

 

public class MainActivity extends Activity {

 

    private List<Person> personList;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

       

        ListView mListView = (ListView) findViewById(R.id.listview);

       

        PersonDao dao = new PersonDao(this);

        personList = dao.queryAll();

       

        // view层对象ListView和控制器BaseAdapter关联起来

        mListView.setAdapter(new MyAdapter());

    }

 

    /**

     * @author andong

     * 数据适配器

     */

    class MyAdapter extends BaseAdapter {

 

        private static final String TAG = "MyAdapter";

 

       /**

         * 定义ListView的数据的长度

         */

       @Override

       public int getCount() {

           return personList.size();

       }

 

       @Override

       public Object getItem(int position) {

           // TODO Auto-generated method stub

           return null;

       }

 

       @Override

       public long getItemId(int position) {

           // TODO Auto-generated method stub

           return 0;

       }

 

       /**

        * 此方法返回的是ListView的列表中某一行的View对象

        * position 当前返回的view的索引位置

        * convertView 缓存对象

        * parent 就是ListView对象

        */

       @Override

       public View getView(int position, View convertView, ViewGroup parent) {

          

          

           TextView tv = null;

          

           if(convertView != null) {       // 判断缓存对象是否为null,  不为null时已经缓存了对象

              Log.i(TAG, "getView: 复用缓存" + position);

              tv = (TextView) convertView;

           } else {   // 等于null, 说明第一次显示, 新创建

              Log.i(TAG, "getView: 新建" + position);

              tv = new TextView(MainActivity.this);

           }

          

           tv.setTextSize(25);

          

           Person person = personList.get(position); // 获得指定位置的数据, 进行对TextView的绑定

          

           tv.setText(person.toString());

          

           return tv;

       }

       

    }

}

10 MainActivity2的代码如下:

package com.itheima28.sqlitedemo;

 

import java.util.List;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ListView;

import android.widget.TextView;

 

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.entities.Person;

 

public class MainActivity2 extends Activity {

 

    private List<Person> personList;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

       

        ListView mListView = (ListView) findViewById(R.id.listview);

       

        PersonDao dao = new PersonDao(this);

        personList = dao.queryAll();

       

        // view层对象ListView和控制器BaseAdapter关联起来

        mListView.setAdapter(new MyAdapter());

    }

 

    /**

     * @author andong

     * 数据适配器

     */

    class MyAdapter extends BaseAdapter {

 

        private static final String TAG = "MyAdapter";

 

       /**

         * 定义ListView的数据的长度

         */

       @Override

       public int getCount() {

           return personList.size();

       }

 

       @Override

       public Object getItem(int position) {

           // TODO Auto-generated method stub

           return null;

       }

 

       @Override

       public long getItemId(int position) {

           // TODO Auto-generated method stub

           return 0;

       }

 

       /**

        * 此方法返回的是ListView的列表中某一行的View对象

        * position 当前返回的view的索引位置

        * convertView 缓存对象

        * parent 就是ListView对象

        */

       @Override

       public View getView(int position, View convertView, ViewGroup parent) {

           View view = null;

          

           if(convertView == null) {

              // 布局填充器对象, 用于把xml布局转换成view对象

              LayoutInflater inflater = MainActivity2.this.getLayoutInflater();

              view = inflater.inflate(R.layout.listview_item, null);

           } else {

              view = convertView;

           }

          

           // view中的姓名和年龄赋值

           TextView tvName = (TextView) view.findViewById(R.id.tv_listview_item_name);

           TextView tvAge = (TextView) view.findViewById(R.id.tv_listview_item_age);

          

           Person person = personList.get(position);

                           

           tvName.setText("姓名: " + person.getName());

           tvAge.setText("年龄: " + person.getAge());

           return view;

       }

       

    }

}

 

目录
相关文章
存储 人工智能 机器人
32 0
|
3月前
|
数据可视化 BI API
无缝对接云数据库:自定义报表生成工具在混合云环境下的部署指南
自定义报表生成工具通过拖拽设计、多数据源整合及自动化输出,帮助业务人员零代码创建个性化报表,解决传统工具灵活性不足、技术门槛高的问题。文章对比其与传统报表差异,列举行业应用场景(如财务、零售),并给出选型建议与主流工具(如FineReport、Power BI、板栗看板)的优劣势分析。
114 0
|
3月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
171 11
|
5月前
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
223 65
Android自定义view之网易云推荐歌单界面
|
5月前
|
XML 前端开发 Android开发
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
551 84
|
5月前
|
前端开发 Android开发 UED
讲讲Android为自定义view提供的SurfaceView
本文详细介绍了Android中自定义View时使用SurfaceView的必要性和实现方式。首先分析了在复杂绘制逻辑和高频界面更新场景下,传统View可能引发卡顿的问题,进而引出SurfaceView作为解决方案。文章通过Android官方Demo展示了SurfaceView的基本用法,包括实现`SurfaceHolder.Callback2`接口、与Activity生命周期绑定、子线程中使用`lockCanvas()`和`unlockCanvasAndPost()`方法完成绘图操作。
113 3
|
5月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
446 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
5月前
|
Android开发
Android自定义view之利用PathEffect实现动态效果
本文介绍如何在Android自定义View中利用`PathEffect`实现动态效果。通过改变偏移量,结合`PathEffect`的子类(如`CornerPathEffect`、`DashPathEffect`、`PathDashPathEffect`等)实现路径绘制的动态变化。文章详细解析了各子类的功能与参数,并通过案例代码展示了如何使用`ComposePathEffect`组合效果,以及通过修改偏移量实现动画。最终效果为一个菱形图案沿路径运动,源码附于文末供参考。
|
5月前
|
Android开发 开发者
Android自定义view之围棋动画(化繁为简)
本文介绍了Android自定义View的动画实现,通过两个案例拓展动态效果。第一个案例基于`drawArc`方法实现单次动画,借助布尔值控制动画流程。第二个案例以围棋动画为例,从简单的小球直线运动到双向变速运动,最终实现循环动画效果。代码结构清晰,逻辑简明,展示了如何化繁为简实现复杂动画,帮助读者拓展动态效果设计思路。文末提供完整源码,适合初学者和进阶开发者学习参考。
Android自定义view之围棋动画(化繁为简)
|
5月前
|
Java Android开发 开发者
Android自定义view之围棋动画
本文详细介绍了在Android中自定义View实现围棋动画的过程。从测量宽高、绘制棋盘背景,到创建固定棋子及动态棋子,最后通过属性动画实现棋子的移动效果。文章还讲解了如何通过自定义属性调整棋子和棋盘的颜色及动画时长,并优化视觉效果,如添加渐变色让白子更明显。最终效果既可作为围棋动画展示,也可用作加载等待动画。代码完整,适合进阶开发者学习参考。
104 0

热门文章

最新文章