Android开发——Android特殊,样式、国际化、动画、提示框、多媒体

一.样式和主题style

使用:对于在布局文件中重复出现的属性值定义在style内,可以被多个控件共同调用使用

注意:style文件内与控件内出现相同的属性不同的值,控件中的值会覆盖掉style文件中的值

1.使用方法

在values\下的style.xml文件中按照如下方式书写,即可通过name属性值调用这个配置

 <style name="myStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:text">@string/hello_world</item>
        <item name="android:textSize">20sp</item>
        <item name="android:textColor">#f00</item>
        <item name="android:layout_marginTop">10dp</item>
    </style>

调用方式如下:记得,这个style同时可以被界面作为主题调用

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
     >
    <TextView
		style="@style/myStyle"
         />
  
    <TextView
        style="@style/myStyle"
         />
    
    <TextView
        style="@style/myStyle"
         />
    
    <TextView
       style="@style/myStyle"
         />
</LinearLayout>

二.应用程序的国际化

方法:只要在res目录下创建【values-国际简称】的目录,如【values-en】,程序中需要的字符串都做成引用的方式即可

技巧:IE浏览器==>【工具菜单】==>【Internet选项】==>【语言按钮】==>【添加按钮】,即可查看所有国家的国际简称

三.动画

注意:动画时异步执行的

1.帧动画

前言:可在文档中的【Animation  and  Graphics】==>【Drawable  Animation】栏目下查看帧动画说明,并且其中有实例代码

1.1 建立帧动画的配置文件

使用:在res目录下创建【drawable目录】,然后再这个目录下创建包含【animation-list】节点的xml文件,名称自拟,如下:

注意:用到的图片要放在drawable目录下,不要放在图片目录下

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true"><!-- onshot:只显示一次 -->
    <item android:drawable="@drawable/girl_1" android:duration="200" /><!-- drawable:图片    duration:一帧显示的时常 -->
    <item android:drawable="@drawable/girl_2" android:duration="200" />
    <item android:drawable="@drawable/girl_3" android:duration="200" />
</animation-list>

1.2 建立播放动画的布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/iv_zhenanim"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

1.3 执行动画的逻辑

ImageView iv_zhenanim = (ImageView) findViewById(R.id.iv_zhenanim);
iv_zhenanim.setBackgroundResource(R.drawable.anim);
AnimationDrawable anim = (AnimationDrawable) iv_zhenanim.getBackground();
		
anim.start();

2.补间动画

特点:真实的坐标在动画执行完毕后是不会改变的,虽然控件显示表示已经不存在于那里了,不过实际上还是在的,所以移动动画控件如果是可点击的,动画执行完毕后需要设置其为不能点击

2.1 透明动画( Alpha)

//1.0意味着完全不透明,0代表完全透明
AlphaAnimation alpha = new AlphaAnimation(0,1);
alpha.setDuration(2000);//设置时长
alpha.setRepeatCount(3);//动画的重复次数,实际次数为3+1=4次
alpha.setRepeatMode(AlphaAnimation.REVERSE);//重复模式,前后两次效果完全相反
		
//开启动画的方法是View对象的方法
iv_aim.startAnimation(alpha);

2.2 旋转动画( Rotate)

//表示顺时针旋转360度,以控件左上角的点为旋转点。
RotateAnimation rotate = new RotateAnimation(0 ,360);
		
//表示顺时针旋转360度,后四个参数分别表示相对于自己还是父窗体,相对于哪个坐标点(横坐标是自己的一半,纵坐标是自己的一半这个点,以这个旋转)
RotateAnimation rotate1 = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

2.3 缩放( Scale)

//前四个参数表示横纵坐标发达缩小的比例,后四个参数制定了缩放点
ScaleAnimation scale = new ScaleAnimation(0.2f, 2, 0.2f, 2, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

2.4 位移( Translate)

//前4个参数表示X方向从哪点到哪点,后4个参数表示Y方向从哪点到哪点
TranslateAnimation transalte = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -0.5f, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, -0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);

2.5 动画合集

//动画集合构造时可以通过布尔类型的参数来判定是否使用插补器
AnimationSet set = new AnimationSet(false);
		
//可以向动画集合中添加多个动画,多个动画会同时执行
set.addAnimation(transalte);
iv_aim.startAnimation(set);

2.6 Xml生成动画

(1)四种动画的Xml文件

<!-- 渐变动画 -->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromAlpha="1.0"
    android:repeatCount="2"
    android:repeatMode="reverse"
    android:toAlpha="0" >
    
    <!-- 调用这个动画通过AnimationUtils.loadAnimation(context,id)来获取该动画的对象 -->

</alpha>


<!-- 旋转动画 -->
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromDegrees="0"
    android:pivotX="50%p"
    android:pivotY="50%p"
    android:repeatCount="2"
    android:repeatMode="restart"
    android:toDegrees="360" >
    
    <!-- pivotX和pivotY的值是相对于父亲的50% -->

</rotate>


<!-- 缩放动画 -->
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXScale="0.1"
    android:fromYScale="0.1"
    android:repeatCount="2"
    android:repeatMode="reverse"
    android:toXScale="2.0"
    android:toYScale="2.0" >

</scale>


<!-- 位移动画 -->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="-50%p"
    android:fromYDelta="-50%"
    android:repeatCount="2"
    android:repeatMode="restart"
    android:toXDelta="50%p"
    android:toYDelta="50%p" >

</translate>

(2)如何在代码中运行Xml动画

Animation shake = AnimationUtils.loadAnimation(context,xml动画索引值——R.anim.shake);

3.属性动画

3.1 ObjectAnimator终类

特点:位置大小会真的变化,API11——3.0出现的新特性

四中动画的属性值:【位移】————translationX,translationY,rotation,rotationX,rotationY,scaleX,scaleY,alpha

Public Methods
static <T>  ObjectAnimator ofFloat(T target,  Property<T,  Float> property, float... values)
初始化属性动画对象,变化数值是float.参数1:作用的控件;参数2:动画的属性值,属性值是控件已经设置好的,可以通过控件的set方法查看;参数3:存储了动画移动的到的坐标,变换的数值
static <T>  ObjectAnimator ofInt(T target,  Property<T,  Integer> property, int... values)
初始化属性动画对象,变化数值是int.参数和上边相同

3.2 AnimatorSet终类

Public Methods
AnimatorSet setDuration(long duration)
设置动画集合运行的时长
void setTarget( Object target)
设置动画集合作用的控件
void playTogether( Animator... items)
设置动画集合作用的控件
void playSequentially( Animator... items)
封装动画动集合并且全部动画是按照顺序运行的
void start()
运行动画集合中的动画

3.3 Xml创建属性动画

(1)首选在res目录中创建animator目录

(2)然后创建属性动画的xml文件

<animator>
	<objectAnimator
		android:propertyName="translationY"------------属性值
		android:duration="2000"-----------运行时间
		android:valueFrom="10"
		android:valueTo="100">
	</objectAnimator>
</animator>

(3)通过以下方式加载

ObjectAnimator oa = (ObjectAnimator)AnimatorInflater.loadAnimator(this,R.animator.manimator);//动画索引id值
oa.setTarget(iv);
oa.start();

4.值动画

注:值动画按理说不应该这样单划分出来,它只是属性到基类,几种属性动画都是调整值动画的数值来实现各种动画效果的

问题:值动画API是11以上的,如何才能实现向下兼容?

<1>.自定义一个ValueAnimator对象

<2>.使用第三方jar包实现

Public Methods
static  ValueAnimator ofFloat(float... values)
初始化值动画对象,并且控制值动画变化的值。参数:传入多个指定变化的值域
static  ValueAnimator ofInt(int... values)
初始化值动画对象,并且控制值动画变化的值。参数:传入多个指定变化的值域
void addUpdateListener( ValueAnimator.AnimatorUpdateListener listener)
设置值动画值变化的监听
Object getAnimatedValue()
设置值动画值变化的监听
abstract  Animator setDuration(long duration)
设置动画执行的时间
void start()
开始动画

四.提示框

1.AlertDialog.Builder静态类

注意:通过addView()添加一个子布局的话最好设置布局父类背景颜色是白色,不这样2.3显示可能有问题
Public Constructors
AlertDialog.Builder( Context context)
初始化提示框,context必须接受Activity获取子类
AlertDialog.Builder( Context context, int theme)
初始化,特性同上,主题值在AliertDialog类中
Public Methods
AlertDialog create()
返回此Builder所建立的Dialog对象,只有Dialog对象有dismiss方法
Context getContext()
获取上下文
AlertDialog.Builder setMessage(int messageId)
设置提示信息,设置了提示信息就不要再设置其中的内容,如setView和set单选框信息
AlertDialog.Builder setTitle( CharSequence title)
设置标题头
AlertDialog.Builder setIcon( Drawable icon)
设置提示框通过Drawable对象
AlertDialog.Builder setIcon(int iconId)
设置提示框的图标通过图片id值
AlertDialog.Builder setView( View view)
设置填充的布局文件
AlertDialog show()
显示对象框,与Toast的show方法类似
AlertDialog.Builder setPositiveButton( CharSequence text,  DialogInterface.OnClickListener listener)
设置提示框的确认按钮
AlertDialog.Builder setNegativeButton( CharSequence text,  DialogInterface.OnClickListener listener)
设置提示框的取消按钮
AlertDialog.Builder setSingleChoiceItems( CharSequence[] items, int checkedItem,  DialogInterface.OnClickListener listener)
设置单选框,items:表示填充单选框的数组,checkeditem:表示打开是默认选中位置的索引,listener:选择监听器
AlertDialog.Builder setMultiChoiceItems( CharSequence[] items, boolean[] checkedItems,  DialogInterface.OnMultiChoiceClickListener listener)
设置多选框,items:多选框条目,checkedItems:多选框所有条目的选中信息,listener:选择监听器
AlertDialog.Builder setCancelable(boolean cancelable)
设置为false,会禁止提示框被返回键取消,不过最好不要用这一个功能,用户体验太差
AlertDialog.Builder setOnCancelListener( DialogInterface.OnCancelListener onCancelListener)
设置返回的一个监听者,只要你一一点击返回就会触发监听者的某个方法

2.AlertDialog类

Public Methods
void setView( View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight, int viewSpacingBottom)
设置提示框布局,并且能够设置布局与提示框设置边距。全部把边距设置为0,可解决2.3系统提示框显示问题
void setView( View view)
设置提示框的内部布局样式
void dismiss()
从Dialog类继承的方法,退出当前对话框

五.多媒体

1. 图像

1.1 基本常识

(1)BMP图片内存大小  ==  图片的总像素  x  每个像素的大小

      <1>.单色:要么是黑,要么是白,所以像素大小只需要用1位即可表示,一个像素就是1/8字节

      <2>.16色:一个像素最多表示16个颜色,所以只需要0-15就可以存储,也就是0000——>1111,一个像素就是1/2字节

      <3>.256色:一个像素最多表示256个颜色,所以只需要0-255就可以存储,也就是0000-0000——>1111-1111,一个像素就是1个字节

      <4>.24位色:一个像素表示3个字节,RGB——>并且三个颜色各占一个字节

(2)JPG压缩:类似rar压缩,把相邻相同像素颜色值压缩在一起

(3)PNG压缩:无损压缩,采用特殊算法

结论:对于压缩的图片,图片中颜色值越单一压缩效率越高,颜色值越复杂,压缩率越低微

(4)当一张图片要显示在手机上,需要的空间大小计算公式:图片总像素  x  4字节,因为Android是ARGB,用四个字节存储一个像素,所以显示图片在手机中要有一定的缩放比

1.2 BitmapFactory类

Public Methods
static  Bitmap decodeFile( String pathName)
读取一个路径
static  Bitmap decodeFile( String pathName,  BitmapFactory.Options opts)
加载图片之前会先把数据加载进内存
static  Bitmap decodeStream( InputStream is)
读取一个输入流

1.3 BitmapFactory.Options静态类

Fields
public boolean inJustDecodeBounds true:获取bitmap时不会返回Bitmap对象,而是返回null,不过会把图片的信息加载到options这个对象中。false:默认
public int outHeight 图片的高度
public int outWidth 图片的宽度
public int inSampleSize 采样数值,就是把你计算出来的缩放比赋值给这个成员变量,然后获取Bimap时会按照你传入的缩放比进行缩放

1.4 Bitmap终类

注:Android中禁止对原图进行修改,都需要把原图拷贝一个副本进行修改

重点:欺骗一下系统图库应用,发送一条SD卡被挂载的广播,让图库应用重新加载一遍SD卡,可显示保存的图片

Public Methods
static  Bitmap createBitmap(int width, int height,  Bitmap.Config config)
创建一个空的Bitmap,获取一个图片副本时时使用,相当于创建了一张白纸
final int getHeight()
获取一个Bitmap图片的高度
final int getWidth()
获取一个Bitmap图片的宽度
final  Bitmap.Config getConfig()
获取一个Bitmap图片的配置信息
void setPixel(int x, int y, int color)

设置图片中一点的颜色是指定颜色

boolean compress( Bitmap.CompressFormat format, int quality,  OutputStream stream)
保存图片到本地,format:图片格式,此对象有三个静态成员jpg,png,gif;quality:0—100;stream:输出流。

1.5 Canvas类

注:画布类

Public Constructors
Canvas( Bitmap bitmap)
把一张Bitmap画纸铺到画布上
Public Methods
void drawCircle(float cx, float cy, float radius,  Paint paint)
画圆
void drawLine(float startX, float startY, float stopX, float stopY,  Paint paint)
画线
void drawBitmap( Bitmap bitmap,  Matrix matrix,  Paint paint)
画一张图片,参照这个bitmap参数去画,matris:矩阵,paint:画笔
void drawBitmap( Bitmap bitmap, float left, float top,  Paint paint)
画一张图片,参数1:画的图片;参数2:图片与画板的左边距;参数3:图片与画板的上边距;参数4:画笔,出入null表示默认的画笔

1.6 Matrix类

Public Methods
void setRotate(float degrees)
旋转多少度,以自己为基准的(0,0)为旋转点
void setRotate(float degrees, float px, float py)
旋转多少度,并且自定义旋转点,x与y值是具体的长度值,不是百分比
void setTranslate(float dx, float dy)
平移,以(0,0)为基准点
void setScale(float sx, float sy)
缩放,X轴与Y轴的缩放比。x值为负数时就是镜面效果,y值为负数时就是倒影效果
boolean postTranslate(float dx, float dy)
位移,镜面效果需要缩放与位移连用,想让位移方法立即生效,必须使用这个方法
boolean postRotate(float degrees, float px, float py)
旋转,立即生效
boolean postScale(float sx, float sy)
缩放,立即生效

2.音频/视频

2.1 MediaPlayer类


功能:播放视频和音频流,视频只支持MP3和3GP格式

注意:播放音乐最好放在服务中播放,因为Activity结束后成为空进程容易被杀死,服务进程保证歌曲长期在后台运行

Public Constructors
MediaPlayer()
初始化这个播放器,空参数的构造函数
Public Methods
void setAudioStreamType(int streamtype)
设置音频流类型
void setDataSource( String path)
设置数据源,path就是资源路径
void prepare()
准备播放,准备的逻辑执行在主线程,可能会因为请求网络资源阻塞主线程
void prepareAsync()
异步的准备,准备的逻辑执行在子线程,推荐使用这个准备方法
void setOnPreparedListener( MediaPlayer.OnPreparedListener listener)
注册一个准备播放的监听,加不加都可以,不过最好加上。监听准备好后再播放
void start()
第一次就是开始播放,以后调用此方法就是继续播放的功能,一般在监听中运行此方法
void pause()
暂停播放
int getDuration()
获取歌曲或视频文件的总时长
int getCurrentPosition()
获取到歌曲当前的播放位置,以总长度为基准
void seekTo(int msec)
跳到指定位置
void release()
释放资源
void reset()
重启播放器到未初始化的时候,就是设置资源路径之前
void setDisplay( SurfaceHolder sh)
设置视频显示,该参数值通过SurfaceView对象获取
boolean isPlaying()
是否正在播放
void setLooping(boolean looping)
设置循环的次数
void setVolume(float leftVolume, float rightVolume)
设置音量大小,值为1是最大值,参数1:左声道;参数2:右声道
static  MediaPlayer create( Context context, int resid)
实例化MediaPlayer播放器对象,此方法会自动调用prepare()方法。参数2:资源的引用id。 音乐资源要放在【res/raw】目录下

2.2 AudioManager类

Constants
int STREAM_ALARM 闹铃音频流
int STREAM_RING 音乐音频流
int STREAM_MUSIC 响铃音频流

2.3 SurfaceView类

注解:显示视频的控件,并且这是一个重量级控件

解释:轻量级控件——显示的内容是通过onDraw()方法画出来的

            重量级控件——不是画出来的,必须等待它加载完才能加载资源

特:a.这个类底层维护了两个线程,A线程——显示界面,B线程——后台加载数据

         b.可以在子线程更新UI

Public Methods
SurfaceHolder getHolder()
获取运行Holder,来给MediaPlaryer用

2.3 SurfaceHolder接口

Public Methods
abstract void addCallback( SurfaceHolder.Callback callback)
解决视频无法播放的问题。添加三个回调方法,分别是:SurfaceView销毁、创建、放生改变,想要播放视频,需要在创建的回调方法中开启MediaPlayer。

2.4 VideoView类

注解:播放视频的控件,继承了SufaceView,对MediaPlayer进行了封装

Public Methods
void setVideoPath( String path)
     设置视频的路径
void start()
    开始播放

2.4 vitamio框架

官网:www.vitamio.org

注明:ffmpeg解码技术,支持大多数视频格式

使用:

(1)引入vitamio的lib

(2)在布局中添加如下

<io.vov.vitamio.widget.VideoView 
        android:id="@+id/vv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
/>

(3)逻辑处理代码如下:

if (!LibsChecker.checkVitamioLibs(this)) {
			return;
}
		
final VideoView vv = (VideoView) findViewById(R.id.vv);
vv.setVideoPath("http://192.168.1.2:8080/haha.avi");
vv.setOnPreparedListener(new OnPreparedListener() {
			
	@Override
	public void onPrepared(MediaPlayer mp) {
		vv.start();
				
	}
});
	//设置video的控制器
vv.setMediaController(new MediaController(this));

(4)一定要在清单文件中初始化InitActivity,这个Activity时vitamio中的一个类

3.调用系统的摄像头

解释:没有直接封装摄像头的api,因为Android的手机型号太多了

方式:隐式意图开始照相或者录像,具体方法去查看文档【Media and Camera】==>【Camera】,想用模拟器调用计算机摄像头需要Webcam0模式

3.1 照相

 //创建意图对象
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath(),"paizhao.png"))); // set the image file name

//开启意图   获取结果 
startActivityForResult(intent, 0);

3.2 录像

 //创建意图对象
 Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath(),"luxiang.3gp"))); // set the image file name

//开启意图   获取结果 
startActivityForResult(intent, 0);

六.布局相关

1. selector选择器

小知识:当你想设置不点击时和原图没有任何区别时,可设置选择器中的drawable值或者color值为“@android:color/transparent”

(1)这是一个普通的选择器,能够作为任意控件的背景

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/function_greenbutton_pressed" /><!-- 按下时的显示的图片 -->
    <item android:state_focused="true" android:drawable="@drawable/function_greenbutton_pressed" /><!-- 获取焦点时显示的图片 -->
    <item android:drawable="@drawable/function_greenbutton_normal"/><!-- 默认什么都不做时显示的图片 -->
</selector>

2.shape形状

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle">---------restangle:矩形;oval:圆;line:线;ring:圆环
	<!-- 矩形的圆角弧度 -->
    <corners android:radius="10dp"/>----------半径值就是圆角半径值。其他参数设置的是单一圆角半径值

	<!-- 纯色 -->
    <solid android:color="@color/gray"/>

	<!-- 渐变 -->
	<gradient 
        android:startColor="#F00"---------开始色
        android:centerColor="#66CCFF"----------中间色
        android:endColor="#000"---------结束色,还有angle这种属性调节渐变的角度
    />

	<!-- 线条 -->
    <stroke 
        android:width="1dp"----------线条宽度
        android:color="#000"-----------线条颜色
        android:dashWidth="3dp"-----------虚线每一个小线段的长度
        android:dashGap="2dp"-----------虚线中分割段的长度
    />
</shape>

Shape形状的其他用法

ProgressBar通过【android:indeterminateDrawable="@drawable/..."】设置自定义的背景样式

<rotate xmlns:android="http://schemas.android.com/apk/res/android"-----------设置的圆环旋转动画
    android:fromDegrees="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="360" >
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:innerRadiusRatio="2.5"------------内半径比,就是圆环里圆的半径比,半径比值越大,圆越小;反之值越大
        android:shape="ring"------------圆环
        android:thicknessRatio="15"------------厚度比,圆环外环厚度比,厚度比值越大,圆越小;反之,值越大
        android:useLevel="false"------------让外边的旋转动画和shape互不影响的属性 >
        <gradient
            android:centerColor="#FF6666"
            android:endColor="#FF0000"
            android:startColor="#FFF"
            android:type="sweep" />
    </shape>
</rotate>

3.插补器

使用:一般与动画连用,能够修改x变化的值为指定方程式的值,x类似于时间值,所得出的y值方程式值就是移动的距离,这样就能够实现各种加速,周期,弹簧等移动效果

//自定义插补器
Animation animation = new Animation(){};
animation.setInterpolator(new android.view.animation.Interpolator() {
	
	@Override
	public float getInterpolation(float x) {
		return x;//这里输入值变化的方程式,来改变移动值得特殊变化,这样写就是指匀速移动y=x,这种形式
	}
});

循环插补器的Xml文件定义

<cycleInterpolator android:cycles="7" />------------循环插补器,循环次数是7次


4.图层

注:自定义进度条要要需要一个图层,并且ProgressBar添加此图层通过progressDrawable属性

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
	<!--进度条背景-->
	<item
		android:id="@android:id/background"
		android:drawable="@drawable/security_progress_bg"/>

	<!--预加载进度图片-->
	<item
		android:id="@android:id/secondaryProgress"
		android:drawable="@drawable/security_progress">
	</item>

	<!--进度加载图片-->
	<item
		android:id="@android:id/progress"
		android:drawable="@drawable/security_progress">
	</item>
</layer-list>

5. 9patch图( *.9.png)

效果:Android手机上,可以按照需求自动拉伸的图片

(1)制作工具:【sdk/tools/draw9patch.bat

(2)使用方法:

a.把目标图片拖曳到图形编辑器中,会看到一个图片的编辑图和三个图片的拉伸效果图

b.编辑图片,上边线中的黑色点或者线表示水品拉伸的区域(当整体颜色基本相同,拉伸区域设置为点即可。如果颜色有差异,根据需求设置拉伸区域为线)

c.左边线表示的是图片的垂直拉伸区域

d.右边线和下边线表示的是文本输入的内容区域,并且这个区域会随着上边或左边的拉伸而拉伸


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值