下拉框菜单的绘制
顺序步骤
1. 编写UI
2. 点击弹出popupwindow
当点击向下箭头按钮时弹出PopUpWindown窗口
自定义一个ListView
ListView listView=new ListView(Context context);
//第一个参数是:要显示包含的控件内容,第二参数是窗口的宽度,第三个参数是窗口的高度
PopupWindown pw=new PopupWindoen(listview ,width,heght);
// 设置焦点和背景,实现点击外部可以关闭对话框的效果
mPopupWindow.setFocusable(true);
mPopupWindow.setBackgroundDrawable(new ColorDrawable());
// 让窗口在输入框下面
mPopupWindow.showAsDropDown(mEd_input);
3. 着手实现listView
4. 关联上popupwindow
1. PopupWindown pw=new PopupWindoen(listview ,width,heght);
/*
* 宽度是从布局里面获取的,实际上这个宽度就是match_parent 不带模式的int值
* 高度就是图片的高度。
*
*/
>MeasureSpec.getSize(widthMeasureSpec)
ViewGrounp
望文生义就是View的容器
//绘画控件
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
// super.onDraw(canvas);
//定义一个画笔
Paint mPaint=new Paint();
//画直线
canvas.drawLine(0, 0, 0, -400, mPaint);
//画圆
mPaint.setColor(Color.BLUE);
canvas.drawCircle(250, 250, 100, mPaint);
//画空心圆--
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(250, 250, 150, mPaint);
//画图片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.haha);
canvas.drawBitmap(bitmap, 200, 300, mPaint);
//画三角形
//首先是要定义一个路径
Path path = new Path();
//设置一个点
path.moveTo(150, 150);
//从这个点连接到另外第二个点
path.lineTo(200, 100);
//从第二个点连接第三个点
path.lineTo(250, 200);
//连接原点
path.lineTo(150, 150);
//把它绘画出来
canvas.drawPath(path, mPaint);
//画扇形
/*
* 参数一:矩形
* 参数二: 开始的位置 圆心的x坐标方向过来就是0的位置
* 参数三:画过的角度
* 参数四: true :有边, false :
* 只会有弧形 参数五: 画笔
*/
//获取矩形
RectF mov=new RectF(200, 200, 200, 200);
//画扇形
canvas.drawArc(mov, 0, 45, true, mPaint);
}
自定义View滑动开关绘制
/**
* 自定义一个控件继承View
* @author Administrator
*
*/
>>布局
<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" >
<com.lxk.slidetoggle.view.SlideToggleView
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
>>代码部分
public class SlideToggleView extends View implements OnClickListener {
boolean isToggle = false;
private Bitmap mBkBitmap1;
private Bitmap mBitmap2;
private Paint mPaint;
public SlideToggleView(Context context, AttributeSet attrs) {
super(context, attrs);
//创建一个画笔
mPaint = new Paint();
//加载开关的按钮和背景图片
mBkBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
mBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.switch_button);
//在自定义本事中监听本身控件,跟在付控件监听也是一样的
setOnClickListener(this);
}
//设置控件的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//super.onMeasure(200, 200);
//这里设置为开关背景的长度和宽度,这样方便对开关按钮的位置处理
setMeasuredDimension(mBkBitmap1.getWidth(), mBkBitmap1.getHeight());
}
//设置布局的位置,如果是一个View则不需要,因为在父控件已经定义好
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
// TODO Auto-generated method stub
super.onLayout(changed, left, top, right, bottom);
}
//绘画
@Override
protected void onDraw(Canvas canvas) {
//
//super.onDraw(canvas);
if (isToggle) {
canvas.drawBitmap(mBkBitmap1, 0, 0, mPaint);
canvas.drawBitmap(mBitmap2, 0, 0, mPaint);
} else {
canvas.drawBitmap(mBkBitmap1, 0, 0, mPaint);
canvas.drawBitmap(mBitmap2, getWidth()-mBitmap2.getWidth(), 0, mPaint);
}
}
@Override
public void onClick(View v) {
if (isToggle) {//如果开关是开着则关上
isToggle=false;
} else {//如果开关是关着则打开
isToggle=true;
}
//通过invalidate()再调用onDraw()一次--注意不能直接调用onDraw()
invalidate();
}
}
交叉布局
布局
<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" >
<com.lxk.Grounp.view.CrossverView
android:id="@+id/cv_rever"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="200dp"
android:layout_height="50dp"
android:background="#8800FF00"/>
<TextView
android:layout_width="200dp"
android:layout_height="50dp"
android:background="#880000FF"/>
<TextView
android:layout_width="200dp"
android:layout_height="50dp"
android:background="#88FF0000"/>
</com.lxk.Grounp.view.CrossverView>
<Button
android:textColor="#0000FF"
android:text="recver"
android:onClick="rever"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:id="@+id/bt_rever"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
public class MainActivity extends Activity {
private CrossverView mCv_rever;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCv_rever = (CrossverView) findViewById(R.id.cv_rever);
}
public void rever(View v){
mCv_rever.revcer();
}
}
代码
package com.lxk.Grounp.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
public class CrossverView extends ViewGroup {
boolean isToggle = false;
private Paint mPaint;
public CrossverView(Context context, AttributeSet attrs) {
super(context, attrs);
//创建一个画笔
mPaint = new Paint();
}
//设置自己布局的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
measureChildren(widthMeasureSpec, heightMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
//设置布局的位置最主要的孩子
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
for (int i = 0; i < getChildCount(); i++) {
//获取孩子元素
View childView=getChildAt(i);
int left;
if (isToggle) {
//从右边排起
if (i%2==0) {
//若是奇数则x坐标从getWidth()-childView.getMeasuredWidth()开始
left=getWidth()-childView.getMeasuredWidth();
} else {
//如果是偶数则x坐标从0开始
left=0;
}
} else {
//默认从左边排起
if (i%2==0) {
//如果是偶数则x坐标从0开始
left=0;
} else {
//若是奇数则x坐标从getWidth()-childView.getMeasuredWidth()开始
left=getWidth()-childView.getMeasuredWidth();
}
}
//设置孩子的坐标位置
int top=i*childView.getMeasuredHeight();
int right=left+childView.getMeasuredWidth();
int bottom=top+childView.getMeasuredHeight();
childView.layout(left, top, right, bottom);
}
}
//绘画
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
}
//交换孩子位置
public void revcer() {
if (isToggle) {
isToggle=false;
} else {
isToggle=true;
}
//通过requestLayout();调用onDraw()方法--与 invalidate 用法几乎差不多,前者会调用onDraw方法,
//但是requestLayout 会重新执行onLayout方法
requestLayout();
}
}