Android StateListDrawable
2016-01-17 10:29
411 查看
*
* 转载请标明出处:http://blog.csdn.net/u013598111/article/details/50519404
* @author:【JunTao_sun】
*
*
/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewGroup b = (ViewGroup) this.findViewById(android.R.id.content);
ImageView image = (ImageView) this.findViewById(R.id.image);
StateListDrawable drawable = new StateListDrawable();
SpotlightDrawable start = new SpotlightDrawable(this, b);
start.disableOffset();
SpotlightDrawable end = new SpotlightDrawable(this, b,
R.drawable.spotlight_blue);
end.disableOffset();
drawable.addState(new int[] { android.R.attr.state_pressed }, start);
drawable.addState(new int[] {}, end);
drawable.setCallback(image);
image.setBackground(drawable);
image.setClickable(true);
image.requestFocus();
init();
}
* Copyright (C) 2008 Romain Guy * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.drawable; import android.graphics.drawable.Drawable; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.BitmapFactory; import android.graphics.Bitmap; import android.graphics.Paint; import android.graphics.PorterDuffXfermode; import android.graphics.PorterDuff; import android.graphics.PixelFormat; import android.graphics.Rect; import android.content.Context; import android.view.ViewGroup; import android.view.View; public class SpotlightDrawable extends Drawable { private final Bitmap mBitmap; private final Paint mPaint; private final ViewGroup mView; private boolean mOffsetDisabled; private boolean mBlockSetBounds; private Drawable mParent; public SpotlightDrawable(Context context, ViewGroup view) { this(context, view, R.drawable.spotlight); } public SpotlightDrawable(Context context, ViewGroup view, int resource) { mView = view; mBitmap = BitmapFactory.decodeResource(context.getResources(), resource); mPaint = new Paint(); //src 和dst 的交集变透明 PorterDuff.Mode.SCREEN模式 mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN)); } public void draw(Canvas canvas) { //判断是否取得焦点 if (mView.hasWindowFocus()) { final Rect bounds = getBounds(); canvas.save(); canvas.drawBitmap(mBitmap, bounds.left, bounds.top, mPaint); } } @Override public void setBounds(int left, int top, int right, int bottom) { if (mBlockSetBounds) return; if (!mOffsetDisabled) { final int width = getIntrinsicWidth(); final View view = mView.getChildAt(0); if (view != null) left -= (width - view.getWidth()) / 2.0f; right = left + width; bottom = top + getIntrinsicHeight(); } else { right = left + getIntrinsicWidth(); bottom = top + getIntrinsicHeight(); } super.setBounds(left, top, right, bottom); if (mParent != null) { mBlockSetBounds = true; mParent.setBounds(left, top, right, bottom); mBlockSetBounds = false; } } public void setParent(Drawable drawable) { mParent = drawable; } @Override protected boolean onStateChange(int[] state) { //通过这个方法重新绘制,其中包含一个Drawable.Callback接口 invalidateSelf(); return super.onStateChange(state); } public void setAlpha(int alpha) { mPaint.setAlpha(alpha); } public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public int getIntrinsicWidth() { return mBitmap.getWidth(); } @Override public int getIntrinsicHeight() { return mBitmap.getHeight(); } public void disableOffset() { mOffsetDisabled = true; } }
相关文章推荐
- android控件edittext-addTextChangedListener监听文本的变化
- 分享实现Android图片选择的两种方式
- Android中进程生命周期的优先级
- Android锁屏后数据改变的解决方案
- Android Studio 修改主题
- Android应用开发-小巫CSDN博客client之获取评论列表
- 如何不屏蔽Android系统的返回按键
- Android5.0+(CoordinatorLayout)
- 可靠的功能测试--Espresso和Dagger2
- Android笔记(七十六) 点菜DEMO
- Android 数据存储之 SQLite数据库存储
- Android 值动画 动画要达到的效果 跟动画的执行过程绑定
- android扫描二维码:已经封装为jar包,实现扫描只需一步
- <Android>关于 Android 中的OnScrollListener监听接口
- Android 数据存储之 SharedPreferences储存
- Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包
- the latest ButterKnife and Android-Butterknife-Zelezny
- Android \uFEFF问题
- 功能分解——Android下画分时图与k线图有感
- Android自定义ToolBar布局