package com.qin.selectionDrawable;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.graphics.drawable.StateListDrawable;
/**
*
* @author http://http://blog.csdn.net/qinjuning
*/
//自定义View
public class CustomView extends View /*extends Button*/
{
private static String TAG = "TackTextView";
private Context mContext = null;
private Drawable mBackground = null;
private boolean mBGSizeChanged = true;; //视图View布局(layout)大小是否发生变化
public CustomView(Context context)
{
super(context);
// TODO Auto-generated constructor stub
mContext = context;
initStateListDrawable(); // 初始化图片资源
}
public CustomView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
mContext = context;
initStateListDrawable(); // 初始化图片资源
}
public CustomView(Context context, AttributeSet attrs)
{
super(context, attrs);
// TODO Auto-generated constructor stub
mContext = context;
initStateListDrawable(); // 初始化图片资源
}
// 初始化图片资源
private void initStateListDrawable()
{
//有两种方式获取我们的StateListDrawable对象:
// 获取方式一、手动构建一个StateListDrawable对象
StateListDrawable statelistDrawable = new StateListDrawable();
int pressed = android.R.attr.state_pressed;
int windowfocused = android.R.attr.state_window_focused;
int enabled = android.R.attr.state_enabled;
int stateFoucesd = android.R.attr.state_focused;
//匹配状态时,是一种优先包含的关系。
// "-"号表示该状态值为false .即不匹配
statelistDrawable.addState(new int[] { pressed, windowfocused }, mContext.getResources().getDrawable(R.drawable.btn_power_on_pressed));
statelistDrawable.addState(new int[]{ -pressed, windowfocused }, mContext.getResources().getDrawable(R.drawable.btn_power_on_nor));
//更多其他状态属性
//stateD.addState(new int[]{pressed , windowfocused },mContext.getResources().getDrawable(R.drawable.btn_dialog_selected) )
//stateD.addState(View.EMPTY_STATE_SET, mContext.getResources().getDrawable(R.drawable.btn_dialog_normal));
//statelistDrawable.addState(new int[] { stateFoucesd, windowfocused }, null);
mBackground = statelistDrawable;
//必须设置回调,当改变状态时,会回掉该View进行invalidate()刷新操作.
mBackground.setCallback(this);
//取消默认的背景图片,因为我们设置了自己的背景图片了,否则可能造成背景图片重叠。
this.setBackgroundDrawable(null);
// 获取方式二、、使用XML获取StateListDrawable对象
// mBackground = mContext.getResources().getDrawable(R.drawable.view_background);
}
// //在View类中setFrame是隐藏方法 @hide , 而在TexitView/Button类时可以继承该方法
// protected boolean setFrame(int l , int t , int r ,int b){
//
// if(getLeft() != l || getTop() != t || getRight()!= r || getBottom() != b){
// mBGSizeChanged = true
// }
//
// return super.setFrame(l , t , l , b);
// }
protected void drawableStateChanged()
{
Log.i(TAG, "drawableStateChanged");
Drawable d = mBackground;
if (d != null && d.isStateful())
{
d.setState(getDrawableState());
//Log.i(TAG, "drawableStateChanged and is 111");
}
// //打印各种状态值
// int[] states = d.getState();
//
// for (int i = 0; i < states.length; i++)
// {
// System.out.println("states[" + i + "]" + states[i]);
// }
// Log.i(TAG, "drawableStateChanged and is 222");
super.drawableStateChanged();
}
//验证图片是否相等 , 在invalidateDrawable()会调用此方法,我们需要重写该方法。
protected boolean verifyDrawable(Drawable who)
{
return who == mBackground || super.verifyDrawable(who);
}
//draw()过程,绘制背景图片...
public void draw(Canvas canvas)
{
Log.i(TAG, " draw -----");
if (mBackground != null)
{
if(mBGSizeChanged)
{
//设置边界范围
mBackground.setBounds(0, 0, getRight() - getLeft(), getBottom() - getTop());
mBGSizeChanged = false ;
}
if ((getScrollX() | getScrollY()) == 0) //是否偏移
{
mBackground.draw(canvas); //绘制当前状态对应的图片
}
else
{
canvas.translate(getScrollX(), getScrollY());
mBackground.draw(canvas); //绘制当前状态对应的图片
canvas.translate(-getScrollX(), -getScrollY());
}
}
super.draw(canvas);
}
public void onDraw(Canvas canvas) {
canvas.save();
Paint paint = new Paint();
paint.setTextSize(16);
paint.setColor(Color.YELLOW);
canvas.drawText("自定义View", 0, 20, paint);
canvas.drawText("触摸我可以改变图片背景", 0, 40, paint);
canvas.restore();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Android中View(视图)绘制不同状态背景图片
共26个文件
png:8个
class:6个
java:3个
5星 · 超过95%的资源 需积分: 47 1.0k 下载量 171 浏览量
2012-04-18
20:43:51
上传
评论 21
收藏 71KB RAR 举报
温馨提示
Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入分析Android中View(视图)绘制不同状态背景图片原理深入分析
资源推荐
资源详情
资源评论
收起资源包目录
SelectionDrawable.rar (26个子文件)
SelectionDrawable
AndroidManifest.xml 650B
res
layout
drawable-ldpi
icon.png 2KB
drawable
btn_power_on_nor.png 3KB
btn_power_on_pressed.png 3KB
view_background.xml 389B
drawable-mdpi
icon.png 3KB
drawable-hdpi
drawable-mdpi
btn_power_on_nor.png 3KB
btn_power_on_pressed.png 3KB
icon.png 3KB
icon.png 4KB
values
strings.xml 180B
src
com
qin
selectionDrawable
MainActivity.java 1KB
CustomView.java 6KB
bin
com
qin
selectionDrawable
R.class 474B
MainActivity.class 1KB
R$attr.class 361B
R$string.class 448B
R$drawable.class 544B
CustomView.class 4KB
classes.dex 5KB
SelectionDrawable.apk 22KB
resources.ap_ 17KB
.classpath 280B
assets
default.properties 364B
.project 853B
gen
com
qin
selectionDrawable
R.java 739B
共 26 条
- 1
qinjuning
- 粉丝: 5296
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页