Android开发——Android特殊,样式、国际化、动画、提示框、多媒体
2015-03-26 21:00
591 查看
一.样式和主题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.右边线和下边线表示的是文本输入的内容区域,并且这个区域会随着上边或左边的拉伸而拉伸
相关文章推荐
- Android 第七天重置版_样式主题国际化动画对话框
- Android样式的开发:View Animation篇
- android开发-简单动画3
- 【Android UI设计与开发】第13期:顶部标题栏(四)自定义ActionBar风格和样式
- Android样式的开发:View Animation篇
- Android开发艺术探索——第七章:Android动画深入分析
- Android应用开发——系统自带样式Android:theme
- 链接:掌握android所有控件、ProgressBar 、Android 动画效果、SQLite、四大组件、Android多媒体
- Android开发-RecyclerView-AndroidStudio(八)属性动画(5)ItemDecoration
- Android样式的开发:View Animation篇
- Android样式的开发:View Animation篇
- Android自定义view半圆形"错误提示框"和简单动画使用
- Android入门笔记 - 界面开发 - 帧动画
- Android UI开发第十九篇——介绍一个开源的gifview——Android显示GIF动画
- 【Android UI设计与开发】第13期:顶部标题栏(四)自定义ActionBar风格和样式
- iOS开发之自己封装的提示框(警告框)样式BHAlertView
- 【Android 应用开发】 ActionBar 样式详解 -- 样式 主题 简介 Actionbar 的 icon logo 标题 菜单样式修改
- Android开发之动画
- Android UI开发第十二篇——动画效果Animation
- Android应用开发之国际化