给指定的view添加边框
2015-06-16 16:52
543 查看
很多时候,我们希望给获取焦点的View添加一个高亮的边框,如下面的途中所示,没有选中的Button是没有高亮框的,选中的则有。
要实现这个效果,这里提供一种方案。
1.首先要有一张如上图顶部一样的图片,该图片用来拉伸后作为高亮框。
2.自定义一个MyView,继承自View,1中所提到的图片就是该View的背景图
3.定义一个public void changeFocusPosition(int x,int y,int width,int height)方法,用来在指定的View获得焦点后调用该方法,传入的是需要高亮框显示的位置和大小,
这些值可以由需要添加高亮框的View的属性获得
4.之后根据3中传入的值来改变MyView的Layout参数。
MyView的基本结构定义如下:
public class MyView extends View {
private int srcLeft, srcTop, srcWidth=20, srcHeight=20;
private int desLeft, desTop, desWidth=20, desHeight=20;
private FrameLayout.LayoutParams frame_p;
public MyView(Context context) {
super(context);
}
public void changeFocusPos(int posX, int posY, int destWidth, int destHeight)
{
desLeft = posX;
desTop = posY;
desWidth = destWidth;
desHeight = destHeight;
startFocus();
}
protected void onDraw(Canvas canvas) {
// 绘制焦点
if(frame_p == null)
frame_p = (LayoutParams) this.getLayoutParams();
updateRect();
this.setLayoutParams(frame_p);
}
private void updateRect()
{
frame_p.leftMargin = desLeft ;
frame_p.topMargin = desTop ;
frame_p.width = desWidth ;
frame_p.height = desHeight ;
frame_p.gravity = Gravity.TOP|Gravity.LEFT;
}
private void startFocus()
{
postInvalidate();
}
}
上面之所以写的绕了些,主要是可以在不同的阶段添加相应的控制,实现各种移动动画效果。
使用:
MyView mv = new MyView(this);
mv.setBackgroundResource(R.drawable.frame);
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus == true)
mv.changeFocusPos(v.getLeft(), v.getTop(), v.getWidth(), v.getHeight());
}
要实现这个效果,这里提供一种方案。
1.首先要有一张如上图顶部一样的图片,该图片用来拉伸后作为高亮框。
2.自定义一个MyView,继承自View,1中所提到的图片就是该View的背景图
3.定义一个public void changeFocusPosition(int x,int y,int width,int height)方法,用来在指定的View获得焦点后调用该方法,传入的是需要高亮框显示的位置和大小,
这些值可以由需要添加高亮框的View的属性获得
4.之后根据3中传入的值来改变MyView的Layout参数。
MyView的基本结构定义如下:
public class MyView extends View {
private int srcLeft, srcTop, srcWidth=20, srcHeight=20;
private int desLeft, desTop, desWidth=20, desHeight=20;
private FrameLayout.LayoutParams frame_p;
public MyView(Context context) {
super(context);
}
public void changeFocusPos(int posX, int posY, int destWidth, int destHeight)
{
desLeft = posX;
desTop = posY;
desWidth = destWidth;
desHeight = destHeight;
startFocus();
}
protected void onDraw(Canvas canvas) {
// 绘制焦点
if(frame_p == null)
frame_p = (LayoutParams) this.getLayoutParams();
updateRect();
this.setLayoutParams(frame_p);
}
private void updateRect()
{
frame_p.leftMargin = desLeft ;
frame_p.topMargin = desTop ;
frame_p.width = desWidth ;
frame_p.height = desHeight ;
frame_p.gravity = Gravity.TOP|Gravity.LEFT;
}
private void startFocus()
{
postInvalidate();
}
}
上面之所以写的绕了些,主要是可以在不同的阶段添加相应的控制,实现各种移动动画效果。
使用:
MyView mv = new MyView(this);
mv.setBackgroundResource(R.drawable.frame);
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus == true)
mv.changeFocusPos(v.getLeft(), v.getTop(), v.getWidth(), v.getHeight());
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories