安卓功能案例

目录

这篇文章中,将常见的一些安卓功能实现做一个简单的说明,以便在以后开发中随时查看。

动画

alpha动画

可以通过设定对象的alpha动画来实现对象的透明度,如果对象原先的alpha设定为0,则可以逐渐显示

1
2
3
4
5

ImageView img = (ImageView)findViewById(R.id.xxx);
img.animate()
    .alpha(0f)
    .setDuration(2000);

位置动画

设定x和y的坐标来进行位置上的变化,translationYBy, translationXBy

1
2
3
img.animate()
    .tanslationYBy(1000f)
    .setDuration(2000);

旋转动画

通过rotation(xxxf)来完成旋转动画

缩放动画

通过scaleX, scaleY来完成缩放动画

联和动画

以上的动画可以合并在一起,完成特殊的动画动能。

1
2
3
4
5
img.animate()
    .translationXBy(1000f)
    .translationYBy(1000f)
    .rotationBy(3600)
    .setDuration(2000);

播放视频

  1. 将视频文件放置在res/raw下面
  2. 添加VideoView控件
  3. 关键是找到视频的路径
1
2
videoView.setVideoPath = "android.resource://" + getPackageName() + "/" + R.raw.demovideo);
videoView.start();
  1. 为视频播放添加控制
1
2
3
4
MediaController media = new MediaController(this);
media.setAnchorView(videoView);
videoView.setMediaController(media);
...

播放音频

  1. 将音频文件放置在res/raw下面
  2. 使用MediaPlayer播放音频
1
2
MediaPlayer mplayer = MediaPlayer.create(this, R.raw.mp3);
mplayer.start();
  1. 可以调用mplayer.pause() mplayer.stop()来暂停和停止播放。

控制音量

控制音量主要是通过AudioManager来进行的

1
2
3
4
5
6
7
8
9
//获取服务
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
//获取音乐播放最大音量
int maxVolume = audioManger.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//获取当前系统播放音量
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

//可以通过SeekBar来进行音量的设置
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress.value, 0);

控制播放进度

可以通过MediaPlayer来获取当前播放的音乐的信息,并设置播放进度

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
//获取音乐长度
mplayer.getDuration();

//通过定时器任务来更新进度条的位置
new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        scrubber.setProgress(mplayer.getCurrentPosition());
    }
}, 0, 100); //立即开始,每隔100毫秒调用一次

//可以拖拽进度挑来进行定位
mplayer.seekTo(progress.value);

简单的ListView

ListView是移动客户端最常见的组件,能够显示很多的条目。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
ListView listView = (ListView)findViewById(R.id.listView);

ArrayList<String> myFriend = new ArrayList<>();
myFriend.add("Zhang San");
myFriend.add("Li si");
myFriend.add("Wang wu");
myFriend.add("Zhao liu");
myFriend.add("Liu qi");

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myFriend);

listView.setAdapter(arrayAdapter);

设定点击条目的事件

1
2
3
4
5
6
7
//设置点击条目的事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Log.i("ZJL", myFriend.get(position));
    }
});

在设置字符串数组中,可以应用asList的便捷方法来进行处理,这需要静态导入java.util.Arrays.asList,并将myFrind设置为final对象

1
2
3
import static java.util.Arrays.asList;

final ArrayList<String> myFriend = new ArrayList<String>(asList("Zhang San", "Li si", "Wang wu", "Zhao liu", "Liu qi"));

安卓中的定时任务

可以使用Handler和Runnable来构造一个定时执行的任务。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
//Handler 负责进行处理一个定时运行的任务
final Handler handler = new Handler();
//定义要定时运行的任务
Runnable run = new Runnable() {
    //实际运行的代码在run方法中
    @Override
    public void run() {
        //模拟实际运行的代码
        Log.i("ZJL", "a second must have passed...");
        //handler负责1秒后继续运行任务
        handler.postDelayed(this, 1000);
    }
};

//首次开始运行
handler.post(run);

安卓也提供了一种叫做CountDownTimer的基础类,来让我们完成一种倒计时的任务。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//倒计时10秒,每秒触发任务
 new CountDownTimer(10000, 1000) {
     @Override
     public void onTick(long millisUntilFinished) {
         Log.i("ZJL", "Seconds left: " + millisUntilFinished / 1000);
     }

     @Override
     public void onFinish() {
         Log.i("Zjl", "Countdown Timer Finished");
     }
 }.start();

对CountDownTimer来说,在第一次onTick方法调用的时候,实际上已经经过了1秒,为了精确定时,我们可以设定总时间稍微多一些毫秒。

1
new CountDownTimer(10000 + 100, 1000)

显示和隐藏控件

1
2
view.setVisibility(View.VISIBLE);//显示控件
view.setVisibility(View.INVISIBEL);//隐藏控件,但任然占用空间

安卓中的异步任务

安卓中的异步任务可以简单的通过AsyncTask来完成。在MainActivity中添加内部类定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//第一个参数表示异步类的调用参数类型,第二个表示异步类中间结果的返回类型,第三个参数表示最终的结果返回类型
class DownloadTask extends AsyncTask<String, Void, String> { 
    @Override
    protected String doInBackground(String... params) {
        StringBuilder result = new StringBuilder();

        try {
            URL url = new URL(params[0]);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

            InputStreamReader isr = new InputStreamReader(httpURLConnection.getInputStream());
            int data;
            while ((data = isr.read()) != -1) {
                result.append((char)data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        Log.i("ZJL", "return result");

        return result.toString();
    }
}

在MainActivity中可以调用我们的异步类

1
2
3
4
5
6
7
8
9
DownloadTask task = new DownloadTask();
String result = null;
try {
    result = task.execute("http://www.ldxy.cn").get();
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

Log.i("ZJL", result);

因为涉及到网络访问,需要在AndroidManifest.xml中声明权限

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

利用异步任务下载图像

使用异步任务也可以完成图像的下载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//注意返回值是bitmap
class DownloadTask extends AsyncTask<String, Void, Bitmap> {
    @Override
    protected Bitmap doInBackground(String... params) {
        try {
            HttpURLConnection httpURLConnection = (HttpURLConnection) (new URL(params[0])).openConnection();
            return BitmapFactory.decodeStream(httpURLConnection.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}

调用的方式是:

1
2
3
4
5
6
7
8
ImageView imageView = (ImageView) findViewById(R.id.imageView);
Bitmap myImage = null;
try {
    myImage = (new DownloadTask()).execute("图像地址").get();
    imageView.setImageBitmap(myImage);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

处理JSON数据

安卓可以使用JSONObject来处理网络获取到的JSON数据。

1
2
3
4
5
6
7
8
JSONObject jsonObject = new JSONObject(result);
jsonObject.getString("xxxKey");

JSONArray arr = new JSONArray(jsonString);
for (int i = 0; i < arr.length(); i++) {
    JSONObject item = arr.getJSONObject(i);
    //process item
}