android实例代码
① android下载图片和视频到本地,求代码,求案例
下面是android多线程下载例子截图:
java">packagemm.shandong.com.testmultithreaddownload;
importandroid.app.ProgressDialog;
importandroid.content.Intent;
importandroid.net.Uri;
importandroid.os.Environment;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.text.TextUtils;
importandroid.view.View;
importandroid.widget.EditText;
importandroid.widget.Toast;
importjava.io.File;
importmm.shandong.com.testmultithreaddownload.thread.UpdateUIThread;
importmm.shandong.com.testmultithreaddownload.util.FileUtil;
{
ProgressDialogpb;
EditTexteditText;
Handlerhandler;
=null;
///文件路径
privateStringurl=
"http://gdown..com/data/wisegame/3c00add7144d3915/kugouyinle.apk";
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_multi_thread_down_load);
editText=(EditText)findViewById(R.id.editText);
initHandler();
}
publicvoidinitHandler(){
handler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseFileUtil.startDownloadMeg:
pb.setMax(mUpdateUIThread.getFileSize());//开始
break;
caseFileUtil.updateDownloadMeg:
if(!mUpdateUIThread.isCompleted())//下载进度消息
{
pb.setProgress(mUpdateUIThread.getDownloadSize());
pb.setMessage("下载速度:"+
mUpdateUIThread.getDownloadSpeed()+"k/秒"+
"下载百分比"+mUpdateUIThread.getDownloadPercent()+"%");
}else{
pb.setMessage("下载完成");
}
break;
caseFileUtil.endDownloadMeg:
Toast.makeText(.this,
"下载完成,马上安装",Toast.LENGTH_SHORT).show();
/*apk安装界面跳转*/
Stringfilename=FileUtil.getFileName(url);
Stringstr="/myfile/"+filename;
StringfileName=Environment.getExternalStorageDirectory()+str;
Intentintent=newIntent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(newFile(fileName)),
"application/vnd.android.package-archive");
startActivity(intent);
break;
}
super.handleMessage(msg);
}
};
}
///开始下载软件
publicvoidstartDownLoad(Viewview){
if(TextUtils.isEmpty(editText.getText().toString())){
Toast.makeText(this,"你输入下载文件地址",Toast.LENGTH_SHORT).show();
return;
}else{
url=editText.getText().toString();
}
//启动线程初始化下载参数
mUpdateUIThread=newUpdateUIThread(handler,url,
FileUtil.setMkdir(this)+File.separator,FileUtil.getFileName(url));
pb=newProgressDialog(this);
pb.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pb.show();
mUpdateUIThread.start();
}
}
例子代码太长,只能给你一部分,如果想看完整例子代码,请去360手机助手下载安卓学习手册,点击里面的源码可以查看完成代码,方面快速,里面还有安卓的其它小例子,共108个。
② Android开发之ImageView播放GIF动画实例
Android开发之ImageView播放GIF动画实例
Android的原生控件并不支持播放GIF格式的图片,如果想在Android中显示一张GIF动态图片,可以利用 ImageView控件来完成,但是放进去之后,你会发现,ImageView它只会显示这张图片的第一帧,不会产生任何的动画效果。我们必须通过自定义控件的方式来实现ImageView播放GIF 图片的功能。
首先我们来编写一个PowerImageView控件,让它既能支持ImageView控件原生的所有功能,同时还可以播放GIF动态图片。
先新建一个项目PowerImageViewTest,这里使用Android 4.0+Eclipse。
由于是要自定义控件,会需要一些自定义的控件属性,因此我们需要在values目录下新建一个attrs.xml的文件,在这个文件中添加项目需要的自定义属性。
这里我们目前暂时只需要一个自动播放auto_play属性,XML文件代码如下:
<?xml version="1.0" encoding="utf-8"?>
这个文件完成之后,下面我们来开始编写主类PowerImageView类,由于PowerImageView类需要支持ImageView的所有功能,我们必须要让PowerImageView继承自ImageView,代码如下:
public class PowerImageView extends ImageView implements OnClickListener {
/**
* 播放GIF动画的关键类
*/
private Movie mMovie;
/**
* 开始播放按钮图片
*/
private Bitmap mStartButton;
/**
* 记录动画开始的时间
*/
private long mMovieStart;
/**
* GIF图片的宽度
*/
private int mImageWidth;
/**
* GIF图片的高度
*/
private int mImageHeight;
/**
* 图片是否正在播放
*/
private boolean isPlaying;
/**
* 是否允许自动播放
*/
private boolean isAutoPlay;
/**
* PowerImageView构造函数。
*
* @param context
*/
public PowerImageView(Context context) {
super(context);
}
/**
* PowerImageView构造函数。
*
* @param context
*/
public PowerImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
/**
* PowerImageView构造函数,在这里完成所有必要的初始化操作。
*
* @param context
*/
public PowerImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PowerImageView);
int resourceId = getResourceId(a, context, attrs);
if (resourceId != 0) {
// 当资源id不等于0时,就去获取该资源的流
InputStream is = getResources().openRawResource(resourceId);
// 使用Movie类对流进行解码
mMovie = Movie.decodeStream(is);
if (mMovie != null) {
// 如果返回值不等于null,就说明这是一个GIF图片,下面获取是否自动播放的属性
isAutoPlay = a.getBoolean(R.styleable.PowerImageView_auto_play, false);
Bitmap bitmap = BitmapFactory.decodeStream(is);
mImageWidth = bitmap.getWidth();
mImageHeight = bitmap.getHeight();
bitmap.recycle();
if (!isAutoPlay) {
// 当不允许自动播放的时候,得到开始播放按钮的图片,并注册点击事件
mStartButton = BitmapFactory.decodeResource(getResources(),R.drawable.start_play);
setOnClickListener(this);
}
}
}
}
@Override
public void onClick(View v) {
if (v.getId() == getId()) {
// 当用户点击图片时,开始播放GIF动画
isPlaying = true;
invalidate();
}
}
@Override
protected void onDraw(Canvas canvas) {
if (mMovie == null) {
// mMovie等于null,说明是张普通的图片,则直接调用父类的onDraw()方法
super.onDraw(canvas);
} else {
// mMovie不等于null,说明是张GIF图片
if (isAutoPlay) {
// 如果允许自动播放,就调用playMovie()方法播放GIF动画
playMovie(canvas);
invalidate();
} else {
// 不允许自动播放时,判断当前图片是否正在播放
if (isPlaying) {
// 正在播放就继续调用playMovie()方法,一直到动画播放结束为止
if (playMovie(canvas)) {
isPlaying = false;
}
invalidate();
} else {
// 还没开始播放就只绘制GIF图片的第一帧,并绘制一个开始按钮
mMovie.setTime(0);
mMovie.draw(canvas, 0, 0);
int offsetW = (mImageWidth - mStartButton.getWidth()) / 2;
int offsetH = (mImageHeight - mStartButton.getHeight()) / 2;
canvas.drawBitmap(mStartButton, offsetW, offsetH, null);
}
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mMovie != null) {
// 如果是GIF图片则重写设定PowerImageView的大小
setMeasuredDimension(mImageWidth, mImageHeight);
}
}
/**
* 开始播放GIF动画,播放完成返回true,未完成返回false。
*
* @param canvas
* @return 播放完成返回true,未完成返回false。
*/
private boolean playMovie(Canvas canvas) {
long now = SystemClock.uptimeMillis();
if (mMovieStart == 0) {
mMovieStart = now;
}
int ration = mMovie.ration();
if (ration == 0) {
ration = 1000;
}
int relTime = (int) ((now - mMovieStart) % ration);
mMovie.setTime(relTime);
mMovie.draw(canvas, 0, 0);
if ((now - mMovieStart) >= ration) {
mMovieStart = 0;
return true;
}
return false;
}
/**
* 通过Java反射,获取到src指定图片资源所对应的id。
*
* @param a
* @param context
* @param attrs
* @return 返回布局文件中指定图片资源所对应的id,没有指定任何图片资源就返回0。
*/
private int getResourceId(TypedArray a, Context context, AttributeSet attrs) {
try {
Field field = TypedArray.class.getDeclaredField("mValue");
field.setAccessible(true);
TypedValue typedValueObject = (TypedValue) field.get(a);
return typedValueObject.resourceId;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (a != null) {
a.recycle();
}
}
return 0;
}
}
这个类的代码注释已经非常详细了,我再来简单地解释一下。可以看到,我们重写了ImageView中所有的构建函数,使得 PowerImageView的用法可以和ImageView完全相同。在构造函数中,则是对所有必要的数据进行了初始化操作。首先,我们调用了 getResourceId()方法去获取图片资源对应的id值,在getResourceId()方法内部是通过Java的反射机制来进行获取的。得到了图片资源的id后,我们将它转换成InputStream,然后传入到Movie.decodeStream()方法中以解码出Movie对象。如果得到的Movie对象等于null,说明这是一张普通的图片资源,就不再进行任何特殊处理,因为父类ImageView都帮我们处理好了。如果得到的 Movie对象不等于null,则说明这是一张GIF图片,接着就要去获取是否允许自动播放、图片的宽高等属性的值。如果不允许自动播放,还要给播放按钮 注册点击事件,默认是不允许自动播放的。
接下来会进入到onMeasure()方法中。在这个方法中我们进行判断,如果这是一张GIF图片,则需要将PowerImageView的宽高重定义,使得控件的大小刚好可以放得下这张GIF图片。
再往后就会进入到onDraw()方法中。在这个方法里同样先判断当前是一张普通的图片还是GIF图片,如果是普通的图片就直接调用 super.onDraw()方法交给ImageView去处理就好了。如果是GIF图片,则先判断该图是否允许自动播放,允许的话就调用 playMovie()方法去播放GIF图片就好,不允许的话则会先在PowerImageView中绘制该GIF图片的第一帧,并在图片上绘制一个播放 按钮,当用户点击了播放按钮时,再去调用playMovie()方法去播放GIF图片。
下面我们来看看playMovie()方法中是怎样播放GIF图片的吧。可以看到,首先会对动画开始的时间做下记录,然后对动画持续的时间做下记 录,接着使用当前的时间减去动画开始的时间,得到的时间就是此时PowerImageView应该显示的那一帧,然后借助Movie对象将这一帧绘制到屏 幕上即可。之后每次调用playMovie()方法都会绘制一帧图片,连贯起来也就形成了GIF动画。注意,这个方法是有返回值的,如果当前时间减去动画 开始时间大于了动画持续时间,那就说明动画播放完成了,返回true,否则返回false。
完成了PowerImageView的编写,下面我们就来看一看如何使用它吧,其实非常简单,打开或新建activity_main.xml,代码如下所示:
<relativelayout p=""
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.powerimageviewtest.powerimageview p=""
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/anim"
/>
可以看到,PowerImageView的用法和ImageView几乎完全一样,使用android:src属性来指定一张图片即可,这里指定的anim就是一张GIF图片。然后我们让PowerImageView在布局里居中显示MainActivity中的代码都是自动生成的,这里就不再贴出来了。在AndroidManifest.xml中还有一点需要注意,有些4.0 以上系统的手机启动了硬件加速功能之后会导致GIF动画播放不出来,因此我们需要在AndroidManifest.xml中去禁用硬件加速功能,可以通过指定android:hardwareAccelerated属性来完成,代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest p=""
package="com.example.powerimageviewtest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk p=""
android:minSdkVersion="14"
android:targetSdkVersion="17" />
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:hardwareAccelerated="false"
>
android:name="com.example.powerimageviewtest.MainActivity"
android:label="@string/app_name" >
现在可以来运行一下代码了,一打开程序你就会看到GIF图片的第一帧,点击图片之后就可以播放GIF动画了。
然后我们还可以通过修改activity_main.xml中的代码,给它加上允许自动播放的属性,代码如下所示:
<relativelayout p=""
xmlns:attr="http://schemas.android.com/apk/res/com.example.powerimageviewtest"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.powerimageviewtest.powerimageview p=""
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/anim"
attr:auto_play="true"
/>
这里使用了刚才我们自定义的属性,通过attr:auto_play来启用和禁用自动播放功能。现在将auto_play属性指定成true后,PowerImageView上就不会再显示一个播放按钮,而是会循环地自动播放动画。不仅如此,PowerImageView还继承了ImageView原生的所有功能,只要指定的不是GIF图 片,PowerImageView表现的结果就和ImageView完全一致,现在我们来放一张普通的PNG图片,修改 activity_main.xml中的代码,如下所示:
<relativelayout p=""
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.powerimageviewtest.powerimageview p=""
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/myphoto"
/>
这里在src属性里面指定了一张名字为myphoto的PNG图片,图片在布局正中央显示出来了,正是普通ImageView所具备的功能。我们还可以在PowerImageView中指定android:scaleType等属性,用法和原生的ImageView完全一样。
③ android 动态控制状态栏显示和隐藏的方法实例
这篇文章主要介绍了
方法一:(经试验无效,但网上广为流传,也许是我使用方法不当,有待进一步验证)
android想要应用运行时全屏有一种方法是在activity的onCreat方法中加入如下代码:getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);并且需要在setContentView()之前,否则无效过。从这么多的苛刻条件可以看出这种方法无法满足动态控制。
下面的方法可以满足这个需要。调用View的
setSystemUiVisibility()
方法,其参数如下:
代码如下:
View.SYSTEM_UI_FLAG_FULLSCREEN,
//全屏,状态栏和导航栏不显示
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION,
//隐藏导航栏
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,
//全屏,状态栏会盖在布局上
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,
View.SYSTEM_UI_FLAG_LAYOUT_STABLE,
View.SYSTEM_UI_FLAG_LOW_PROFILE,
View.SYSTEM_UI_FLAG_VISIBLE,
//显示状态栏和导航栏
View.SYSTEM_UI_LAYOUT_FLAGS
方法二:(试验成功)
直接调用此方法即可实现对状态栏的控制;
代码如下:
private
void
full(boolean
enable)
{
if
(enable)
{
WindowManager.LayoutParams
lp
=
getWindow().getAttributes();
lp.flags
|=
WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(lp);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
else
{
WindowManager.LayoutParams
attr
=
getWindow().getAttributes();
attr.flags
=
(~WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setAttributes(attr);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
}
④ 谁有android应用程序开发实例代码或者在哪儿可以下载到完整的代码
你要开发Android程序,必需下载SDK,而SDK里面就自带了大量的DEMO,你建工程的时候就可以看到,或者到SDK目录下的samples文件里面找,都按平台版本分好类了的,这都是官方的DEMO代码。
⑤ android开发中怎样实现混音
android开发中怎样实现混音,实例代码如下:
[mw_shl_code=java,true]public class MixRunnable implements Runnable {
private MixRecorder context;
/**
* AudioRecord创建参数类
*
* @author christ
*/
private static class RecorderParameter {
// 音频获取源
private static int audioSource = MediaRecorder.AudioSource.MIC;
// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
private static final int sampleRateInHz = 44100;
// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
private static final int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
// 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
private static final int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// 缓冲区字节大小
private static int bufferSizeInBytes;
}
// 设置运行状态
private boolean isRunning = true;
// AudioRecord对象
private static AudioRecord recorder;
// 设置MediaPlayer对象
private static MediaPlayer mediaPlayer;
// 伴奏文件
private FileInputStream accompany;
// 原唱文件
private FileInputStream original;
// 得分
private int score;
private boolean isFirst = true;
/**
* 混音评分线程的构造方法
*
* @param accompany
* :伴奏文件路径
* @param original
* :原唱文件路径
* @throws FileNotFoundException
*/
public MixRunnable(MixRecorder context, String accompany, String original) throws FileNotFoundException {
this.context = context;
this.accompany = new FileInputStream(accompany);
this.original = new FileInputStream(original);
creatAudioRecord();
mediaPlayer = new MediaPlayer();
}
@Override
public void run() {
try {
// MediaPlayer准备
mediaPlayer.reset();
mediaPlayer.setDataSource("/sdcard/111.wav");
// mediaPlayer.setDataSource(accompany.getFD());
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
isRunning = false;
}
});
mediaPlayer.prepare();
// 跳过头
accompany.read(new byte[44]);
original.read(new byte[44]);
FileOutputStream fos = new FileOutputStream(new File("/sdcard/love.raw"));
// 开始读
byte[] sourceReader = new byte[RecorderParameter.bufferSizeInBytes * 2];
short[] sourceShortArray;
short[] audioReader = new short[sourceReader.length / 4];
mediaPlayer.start();
recorder.startRecording();
while (isRunning) {
int sourceReadSize = accompany.read(sourceReader, 0, sourceReader.length);
if (sourceReadSize < 0) {
isRunning = false;
continue;
}
sourceShortArray = byteToShortArray(sourceReader, sourceReadSize / 2);
recorder.read(audioReader, 0, audioReader.length);
short[] oneSecond = mixVoice(sourceShortArray, audioReader, sourceReadSize / 2);
byte[] outStream = new byte[oneSecond.length * 2];
for (int i = 0; i < oneSecond.length; i++) {
byte[] b = shortToByteArray(oneSecond<i>);
outStream[2 * i] = b[0];
outStream[2 * i + 1] = b[1];
}
⑥ 如何利用Android编程实现GPS定位
您好,很高兴为您解答。
一、准备工作
需要如下三种软件:
1. Eclipse
2. Android SDK
3. 开发Android程序的Eclipse 插件
为了开始我们的工作,首先要安装Eclipse,然后从Google的网站获得Android SDK,并且安装Eclipse插件。
二、Activity类
每一种移动开发环境都有自己的基类。如J2ME应用程序的基类是midlets,BREW的基类是applets,而Android程序的基类是 Activity。这个activity为我们提供了对移动操作系统的基本功能和事件的访问。这个类包含了基本的构造方法,键盘处理,挂起来恢复功能,以 及其他底层的手持设备的访问。实质上,我们的应用程序将是一个Activity类的扩展。在本文中读者将会通过例子学习到如何使用Activity类来编 写Android程序。下面是一个简单的继承Activity的例子。
{
publicvoidonCreate(Bundleparams){
super.onCreate(params);
setContentView(R.layout.main);
}
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
returntrue;
}
}
三 View类
View类是Android的一个超类,这个类几乎包含了所有的屏幕类型。但它们之间有一些不同。每一个view都有一个用于绘画的画布。这个画布可以用 来进行任意扩展。本文为了方便起见,只涉及到了两个主要的View类型:定义View和Android的XML内容View。在上面的代码中,使用的是 “Hello World” XML View,它是以非常自然的方式开始的。
如果我们查看一下新的Android工程,就会发现一个叫main.xml的文件。在这个文件中,通过一个简单的XML文件,描述了一个屏幕的布局。这个 简单的xml文件的内容如下:
<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
androidrientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerHoriz
android:text=""
/>
</RelativeLayout>
上面的内容的功能看起来非常明显。这个特殊文件定义了一个相关的布局,这就意味着通过一个元素到另一个元素的关系或是它们父元素的关系来描述。对于视图来 说,有一些用于布局的方法,但是在本文中只关注于上述的xml文件。
RealtiveLayout中包含了一个填充整个屏幕的文本框(也就是我们的LocateMe activity)。这个LocateMe activity在默认情况下是全屏的,因此,文本框将继承这个属性,并且文本框将在屏幕的左上角显示。另外,必须为这个XML文件设置一个引用数,以便 Android可以在源代码中找到它。在默认情况下,这些引用数被保存在R.java中,代码如下:
publicfinalclassR{
publicstaticfinalclasslayout{
publicstaticfinalintmain=0x7f030001;
}
}
视图也可以被嵌套,但和J2ME不同,我们可以将定制的视图和Android团队发布的Widgets一起使用。在J2ME中,开发人员被迫选择 GameCanvas和J2ME应用程序画布。这就意味着如果我们想要一个定制的效果,就必须在GameCanvas上重新设计我们所有的widget。 Android还不仅仅是这些,视图类型也可以混合使用。Android还带了一个 widget库,这个类库包括了滚动条,文本实体,进度条以及其他很多控件。这些标准的widget可以被重载或被按着我们的习惯定制。现在让我们来进入 我们的例子。
四、Android实例
这个演示应用程序将演示了用户的当前的经度和纬度(在文本框中显示)。onCreate构造方法将和上面的例子基本相同,除了在其中加入了键盘处理,现在 让我们看一下onKeyDown的代码。
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(keyCode!=KeyEvent.KEYCODE_DPAD_CENTER||m_bLoading)
{
returntrue;
}
m_bLoading=true;
getLocation();
returntrue;
}
下面让我们来解释一下这段代码,首先,这段代码检查了当前被按下的键,但还没有开始处理。而是在getLocation方法中处理这一切的。然后,将装载 flag标志以及调用getLocation方法,下面是getLocation方法的代码。
privatevoidgetLocation(){
Locationloc;
LocationManagerlocMan;
LocationProviderlocPro;
List<LocationProvider>proList;
setContentView(R.layout.laoding);
locMan=(LocationManager)getSystemService(LOCATION_SERVICE);
proList=locMan.getProviders();
locPro=proList.get(0);
loc=locMan.getCurrentLocation(locPro.getName());
Lat=(float)loc.getLatitude();
Lon=(float)loc.getLongitude();
CreateView();
setContentView(customView);
}
到这为止,程序开始变得更有趣了。但是不幸的是,Google关于之方面的文档还是比较少了。在程序的变量声明之后,我们需要演示一些装载信息。 R.layout.loading符合了另一个简单的XML布局视图。通过简单地调用setContentView方法可以使用转载信息重绘屏幕。
读者要注意的是:在编译时,Android会预先将所有的XML布局数据包装起来。如果我们想在编译后变化布局属性,按着规定,我们必须在源程序中做这些 事。
获得LocationManager的唯一方法是通过getSystemService()方法的调用。通过使用LocationManager, 我们可以获得一个位置提供者的列表。在一个真实的手持设备中,这个列表包含了一些GPS服务。实际上,我们希望选择更强大,更精确,最后不带有其他附加服 务的GPS。现在,在模拟器中提供了一个用于测试的GPS,这个GPS来自San Francisco。定制的GPS文件可以可以被上传,并进行测试。如果我们要测试更复杂的应用,来自San Francisco的GPS可能并不适合。
目前我们可以使用位置管理器和位置提供者进行getCurrentLocation的调用。这个方法返回本机的当前位置的一个快照,这个快照将以 Location对象形式提供。在手持设备中,我们可以获得当前位置的经度和纬度。现在,使用这个虚拟的手持设备,我们可以获得这个例子程序的最终结果: 建立了显示一个定制的视图。
五、使用定制视图
在最简单的窗体中,一个Android中的视图仅仅需要重载一个onDraw方法。定制视图可以是复杂的3D实现或是非常简单的文本形式。下面的 CreateView方法列出了上面看到的内容。
publicvoidCreateView(){
customView=newCustomView(this);
}
这个方法简单地调用了CustomView对象的构造方法。CustomView类的定义如下:
{
LocateMeoverlord;
publicCustomView(LocateMepCtx){
super(pCtx);
overlord=pCtx;
}
publicvoidonDraw(Canvascvs){
Paintp=newPaint();
StringsLat="Latitude:"+overlord.getLat();
StringsLon="Longitude:"+overlord.getLon();
cvs.drawText(sLat,32,32,p);
cvs.drawText(sLon,32,44,p);
}
}
这个定制的Android视图获得了经度和违度的测试数据,并将这些数据显示在屏幕上。这要求一个指向LocateMe的指针,Activity类是整 个应用程序的核心。它的两个方法是构造方法和onDraw方法。这个构造方法调用了超类的构造方法以及引起了Activity指针的中断。onDraw方 法将建立一个新的Paint对象(这个对象封装了颜色、透明度以及其他的主题信息),这个对象将会访问颜色主题。在本程序中,安装了用于显示的字符串,并 使用画布指针将它们画到屏幕上。这个和我们了解的J2ME游戏的画布看起来非常类似。
六、Android展望
从纯粹的开发观点看,Android是一个非常强大的SDK。它使用基于XML的布局和定制视图联合了起来。并可以使用滚动条、地图以及其他的组件。所以 的这一切都可以被重载,或由开发人员来定制。但它所提供的文档非常粗糙。在文档中并没有象SMS等技术,但是从整体上来看Android SDK,还是非常有希望的。也非常符合Google承诺的“First Look”SDK。现在我们要做的就是等待Google发布第一个基于Android的手机,并使用它。
如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】
希望我的回答对您有所帮助,望采纳!
~O(∩_∩)O~
⑦ Android 中代码定义颜色的几种方式
Android开发中颜色的自定义方法
1、使用Color类的常量,如:
int color = Color.BLUE; // 创建一个蓝色 是使用Android提供的颜色 int color = Color.RED; int color = Color.WHITE; 2、通过ARGB构建,如:
int color = Color.argb ( 127, 255, 0, 255 ); // 半透明的紫色
其中第一个参数表示透明,0表示完全透明,255(ff)表示完全不透明;后三位分别代表RGB的值了。 3、使用XML资源文件来定义颜色
该方法扩展性好,便于修改和共享,如在values目录下创建一个color.xml: <?xml version=” 1.0” encoding=”utf -8”> <resources>
<color name=”mycolor”> #7fff00ff</color> </resources>
定义了一个名为mycolor的颜色,在别的地方就可以通过引用mycolor来获取该颜色值,如textView定义中:
android:textColor= "@drawable/mycolor"
Java代码中可以使用ResourceManager类中的getColor来获取该颜色: int color = getResources().getColor(R.color.mycolor);
这与第二种方法得到的值是一样的,getResources()方法返回当前活动Activity的ResourceManager类实例。
说明:XML定义方法接受6位和8位两种表示法,而且开头必须是#,8位定义时前两位表示透明。 4、直接定义色值,如: int color = 0xff00ff00;
这种方法必须使用0x开头,而不是用我们常用的#。与方法3不一样,值也必须用8位表示 ,不接受6位的颜色表示。分组一下0x|ff|ff00ff,0x是代表颜色整数的标记,ff是表示透明度,ff00ff表示RGB颜色值。
=======================
补充一点Android布局中背景图片的设置(编辑LinearLayout):
* 可以使用纯色:android:background="@drawable/mycolor" (XML资源文件中定义的颜色)
* 也可使用图片:android:background="@drawable/bg" (需要将一个名为bg.jpg或png的图片拷贝到res/drawable-hdpi目录下)。
⑧ android怎样实现在图片上任意位置添加文字 要代码 急求。。
android在图片上任意位置添加文字,可以使用canvas类进行操作,实例如下:
@Override
protectedvoidonDraw(Canvascanvas)
{
super.onDraw(canvas);
canvas.drawBitmap(m_LogInBmp,null,m_LogIndst,m_txBackPaint);
floattleft=m_LogIndst.left+(m_LogIndst.right-m_LogIndst.left-FontWidth*m_TextLogIn.length())/2;
floatttop=m_LogIndst.top+(m_LogIndst.bottom-m_LogIndst.top-FontHeight)/2+FontHeight;
canvas.drawText(m_TextLogIn,tleft,ttop,mLogInPaint);
}
⑨ 求:android 获取系统相册图片并显示在当前页面的代码
先初始化;
注意自定义 的
private final String IMAGE_TYPE = "image/*";private final int IMAGE_CODE = 0;
private void setImage() {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); getAlbum.setType(IMAGE_TYPE); startActivityForResult(getAlbum, IMAGE_CODE);}
这里使用Intent获得相册图片数据,并返回原来界面;
这里说明一下
startActivityForResult(getAlbum, IMAGE_CODE);
补充{
startActivityForResult与startActivity的不同之处在于:
1、startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。
}
startActivityForResult(getAlbum, IMAGE_CODE);
这里采用startActivityForResult来做跳转,此处的IMAGE_CODE实质是0为一个依据,可以写其他的值,但一定要>=0
然后重写onActivityResult用于接收刚刚得到的数据
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode == IMAGE_CODE) { try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm); } catch (IOException e) {
e.printStackTrace(); }
}
补充{
ContentProvider-----数据提供给第三方应用程序使用时使用
因为在Android系统里面,数据库是私有的。一般情况下外部应用程序是没有权限读取其他应用程序的数据。如果你想公开你自己的数据,你有两个选择:你可以创建你自己的内容提供器(一个ContentProvider子类)或者你可以给已有的提供器添加数据-如果存在一个控制同样类型数据的内容提供器且你拥有写的权限
}
这里是创建一个新的内容提供器,然后在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver实例
if (requestCode == IMAGE_CODE) {
resultCode为回传的标记这句话是在确认是否回传的是你所需要的;如果是就执行try;不然就执行catch (IOException e) {
e.printStackTrace();}先说这里当try语句中出现异常是时,会执行catch中的语句,IOException e也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace() ;。printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。
try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm);接收数据处理数据并显示照片。
然后进行测试。
另附源码:
MainActivity:
package com.example.administrator.myapplication1;import android.graphics.BitmapFactory;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import java.io.IOException;import android.net.Uri;import android.os.Bundle;import android.provider.MediaStore;import android.app.Activity;import android.content.ContentResolver;import android.content.Intent;import android.graphics.Bitmap;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { private final String IMAGE_TYPE = "image/*"; private final int IMAGE_CODE = 0; private Button choose=null; private ImageView imgShow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init();} private void init() { choose=(Button) findViewById(R.id.button1); imgShow=(ImageView) findViewById(R.id.imgShow); choose.setOnClickListener(listener); } private OnClickListener listener=new OnClickListener(){ @Override public void onClick(View v) {
setImage(); }
}; private void setImage() {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); getAlbum.setType(IMAGE_TYPE); startActivityForResult(getAlbum, IMAGE_CODE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode == IMAGE_CODE) { try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm); } catch (IOException e) {
e.printStackTrace(); }
}
}
}
layout:activity_main.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="选择照相" android:layout_marginRight="190dp" android:layout_marginTop="8dp" android:paddingBottom="2dp" android:background="#aabbcc" /> <ImageView android:id="@+id/imgShow" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="15dip" /></LinearLayout>