学Android也有一段时间了,前几天基本都是照着教程打下例子,今天花了一天的时间动手写了一个音乐播放器。期间查了很多资料,因为明天要上班了,赶时间,所以没抄上笔记,有时间再把源码放上来大家学习。看看效果图吧。
在读取歌名方面,因为读取ID3比较复杂,没搞明白还,现在只是读取文件名,再除掉扩展名。功能基本完善了,可以设置音乐目录,避免像自带音乐播放器一样读取卡上的一些游戏音乐之类的文件。本想加上甩歌功能,但是运行网上的重力感应Demo老是出错,暂时无法实现,以后再改吧。
Android程序开发 Handler对象用法(用Handler控制ProgressBar)
当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉。Handler就是把这些功能放到一个单独的线程里执行,与Activity互不影响。今天的例子就结合前几天学的进度条ProgressBar,用Handler更新ProgressBar. 先看最终效果图吧: 当按开始按钮时,进度条会每隔500毫秒加1,直到加到100或者按停止时停止 xml:
package com.pocketdigi;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class main extends Activity {
/** Called when the activity is first created. */
ProgressBar pb1;
Handler handle=new Handler();
//新建一个Handler对象
Button b1;
Button b2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pb1=(ProgressBar)findViewById(R.id.pb1);
pb1.setProgress(0);
b1=(Button)findViewById(R.id.b1);
b1.setOnClickListener(b1Lis);
b2=(Button)findViewById(R.id.b2);
b2.setOnClickListener(b2Lis);
}
private OnClickListener b1Lis=new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
handle.post(add);
//开始执行add
}
};
private OnClickListener b2Lis=new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
handle.removeCallbacks(add);
//停止执行
pb1.setProgress(0);
}
};
int pro=0;
Runnable add=new Runnable(){
//定义add
@Override
public void run() {
// TODO Auto-generated method stub
pro=pb1.getProgress()+1;
pb1.setProgress(pro);
setTitle(String.valueOf(pro));
if(pro<100){
handle.postDelayed(add,500);
//如果进度小于100,,则延迟500毫秒后重复执行add
}
}
};
}
Android UI设计 图片按钮ImageButton用法
图片按钮ImageButton可以把一张图片设为一个按钮,代替Button组件功能,以增加程序美感。 如上图,点击图片按钮后触发OnClickListener事件,在标题栏显示文字 xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageButton android:id="@+id/ib"
android:src="@drawable/bookmark_001"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
程序代码:
package com.pocketdigi;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
public class main extends Activity {
/** Called when the activity is first created. */
ImageButton ib;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ib=(ImageButton)findViewById(R.id.ib);
ib.setOnClickListener(ibLis);
}
private OnClickListener ibLis=new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
setTitle("图片按钮被点了");
}
};
}
Android UI设计 图像控件ImageView用法
ImageView控件用于显示图片,功能简单,用法也简单,先看本例最终效果图: 跟前几个控件相比,ImageView控件在使用上要多一个步骤,就是添加图片文件。 第一步,把图片文件拖进res/drawble目录中(hdpi、ldpi、mdpi貌似都没关系),注意文件名,如果图片文件名是中文的或是数字,会出错。 然后就是布局xml:
<ImageView android:id="@+id/iv"
android:src="@drawable/t2"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
/>
这里的t2就是图片文件名对应,不需要加扩展名,因为这里的t2其实不是文件名,只是R.java里的一个索引 程序里就不需要写了,这样可以直接显示。
Android UI设计 评分控件RatingBar用法
如果大家去market下软件,在下载完的软件那,每个软件都会有5个五角星让你评分,其实这个就是RatingBar,RatingBar可以方便的让用户帮助你打分。 下面是效果图: 界面上就一个TextView,一个RatingBar,当用户执行评分操作时,TextView上会显示当前用户评分。 下面我们来实现。先是布局xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>
<RatingBar android:id="@+id/rb"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:numStars="3"
android:rating="1"
/>
<!--这里要注意了,layout_width必须是wrap_content,如果设成fill_parent,
不管你在后面把满分设为几颗星,它都会把屏幕横向显示满为止-->
</LinearLayout>
其中,以下两句第一句是用来定义总分,第二句是默认评分,其实这两句在这个程序中没用的,因为等会我们在程序代码中要重定义,这里写上只不过是演示用法。
android:numStars="3"
android:rating="1"
下面是程序代码:
package com.pocketdigi;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.RatingBar.OnRatingBarChangeListener;
public class main extends Activity {
/** Called when the activity is first created. */
RatingBar rb;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.tv);
rb=(RatingBar)findViewById(R.id.rb);
rb.setNumStars(5);
rb.setRating(3);
rb.setOnRatingBarChangeListener(rbLis);
//定义一个监听器
}
private OnRatingBarChangeListener rbLis=new OnRatingBarChangeListener(){
@Override
public void onRatingChanged(RatingBar ratingBar, float rating,
boolean fromUser) {
tv.setText(String.valueOf(rb.getRating()));
//输出评分
}
};
}
Android UI设计 SeekBar拖动条用法
SeekBar类似于ProgressBar,不过ProgressBar主要功能是让用户知道目前的状态,而SeekBar的功能在于让用户调整进度。举个例子,在音乐播放器中,你可以通过SeekBar来调整音乐播放的进度。 下面是效果图: 拖动时,TextView会动态显示当前的进度 布局xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>
<SeekBar
android:id="@+id/seek"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="10"
/>
</LinearLayout>
程序代码:
package com.pocketdigi;
import android.app.Activity;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class main extends Activity {
/** Called when the activity is first created. */
SeekBar sb;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.tv);
sb=(SeekBar)findViewById(R.id.seek);
sb.setProgress(90);
sb.setOnSeekBarChangeListener(sbLis);
}
private OnSeekBarChangeListener sbLis=new OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
//进度改变时触发
tv.setText(String.valueOf(sb.getProgress()));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// 开始拖动时触发,与onProgressChanged区别在于onStartTrackingTouch在停止拖动前只触发一次
//而onProgressChanged只要在拖动,就会重复触发
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//结束拖动时触发
}
};
}
Android UI设计 进度条ProgressBar用法举例
进度条可以方便地告诉用法现在执行任务的进度,特别是一个程序需要执行比较长一段时间时,如果没有进度条,用户不知道程序在执行,会以为程序假死而强制关闭程序。 效果图 从上往下,第一个是默认的进度条,第二是大点的,第三是小点的,第四是条状的,关键区别在于xml中的style. main.xml:
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleLarge"
/>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleSmall"
/>
<ProgressBar android:id="@+id/pb1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:max="100"<!--最大进度值为100-->
android:progress="10" <!--默认进度值为10-->
android:secondaryProgress="70" <!--第二进度值为70,就是颜色淡点的那个-->
/>
程序代码:
package com.pocketdigi;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ProgressBar;
public class main extends Activity {
/** Called when the activity is first created. */
ProgressBar pb1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pb1=(ProgressBar)findViewById(R.id.pb1);
pb1.setProgress(50);
}
}
pb1.incrementProgressBy(5); pb1进度值增加5 pb1.incrementProgressBy(-5); pb1进度值减少5 pb1.incrementSecondaryProgressBy(5); pb1背后的第二个进度条 进度值增加5 pb1.incrementSecondaryProgressBy(-5); pb1背后的第二个进度条 进度值减少5
Android UI设计 模拟时钟AnalogClock和数字时钟DigitalClock
模拟时钟AnalogClock和数字时钟DigitalClock,用法功能很简单,就是显示一个模拟时钟或是数字时钟,效果图: 两个时钟都不需要Java代码,只要在layout的xml里插入以下代码即可自动显示时间
<AnalogClock android:id="@+id/AC"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<DigitalClock
android:id="@+id/DC"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
Android UI设计 时间控件TimePicker用法(含取值)
TimePicker是android系统里的时间控件,我们可以通过这个控件让用户输入合法的时间,很方便。 下面是效果图: 具体代码: 布局main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>
<TimePicker android:id="@+id/tp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button android:id="@+id/b1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="显示在标题栏"
/>
</LinearLayout>
程序代码:
package com.pocketdigi;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
public class main extends Activity {
/** Called when the activity is first created. */
TextView tv;
TimePicker tp;
Button b1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TPDemo();
}
public void TPDemo(){
tp=(TimePicker)findViewById(R.id.tp);
tp.setIs24HourView(true);//是否显示24小时制?默认false
tp.setCurrentHour(6);
tp.setCurrentMinute(20);
//设置显示时间为6:20
tp.setOnTimeChangedListener(tpLis);
//时间改变时触发
tv=(TextView)findViewById(R.id.tv);
b1=(Button)findViewById(R.id.b1);
b1.setOnClickListener(b1Lis);
}
private OnTimeChangedListener tpLis=new OnTimeChangedListener() {
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
tv.setText("[" + hourOfDay + ":" + minute + "]" + "["
+ view.getCurrentHour() + ":" + view.getCurrentMinute()
+ "]");
}
}; //时间改变后执行的内容,用两种方式显示在tv上
private OnClickListener b1Lis=new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
setTitle(tp.getCurrentHour()+":"+tp.getCurrentMinute());
}
};//单击按钮后执行的内容,显示时间在标题上
}
Android UI 设计 日期控件DatePicker用法
DatePicker可以让用户选择时间,免去判断输入时间合法性,下图是效果: 点击按钮,会在标题栏上显示选择的时间。 下面一步一步来实现: main.xml:
<DatePicker
android:id="@+id/date_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button android:id="@+id/b1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Click Me"
/>
程序代码:
package com.pocketdigi;
import java.util.Calendar;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
public class main extends Activity {
/** Called when the activity is first created. */
DatePicker dp;
Button b1;
Calendar c;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dp=(DatePicker)findViewById(R.id.date_picker);
dp.init(2010,7,27, null);
//这里要注意,设置初始时间为2010年8月27日,而不是7月27日,
//因为这里月份用0-11表示,没有12的,不设置默认显示系统日期
//下面显示时月份加1道理相同
b1=(Button)findViewById(R.id.b1);
c = Calendar.getInstance();
b1.setOnClickListener(bl);
}
private OnClickListener bl=new OnClickListener(){
@Override
public void onClick(View v) {
//下面是读取方法
setTitle(String.valueOf(dp.getYear())+"年"+String.valueOf(dp.getMonth()+1)+"月"+String.valueOf(dp.getDayOfMonth())+"日");
}
};
}