Android 背景图片的缩放实现

Android 背景图片的缩放

ONE Goal ,ONE Passion !

我们看到一些效果,控件中的背景图片会慢慢变大,但是控件不会随着图片的放大而变大.效果如下:

分析:

想让图片变大,而且控件本身大小不能改变,那么就要改变图片自身大小,而不能改变控件大小.

实现原理:

1,首先拿到我们要放大的图片bitmap.

2,使用Bitmap.createBitmap().创建一个bitmap的副本.

3,使用matrix去改变图片副本本身大小

4,使用ValueAnimator去根据变化率将副本绘制出来.

自定义View

public class ScaleImage extends View { /** * 设置的背景图片 */ private Drawable background; /** * 画布的背景图片 */ private Bitmap bitmapCopy; /** * 跟随动画实时更新的 放大比例 */ float scal = 1f; /** * 让原图放大 1.3倍,这个值可以随意更改.目的是让原图填充满控件 */ private float orgFrac = 1.3f; /** * 控件宽 */ private int widthSize; /** * 控件高 */ private int heightSize; private float downY; private float downX; public ScaleImage(Context context) { this(context, null); } public ScaleImage(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ScaleImage(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); widthSize = MeasureSpec.getSize(widthMeasureSpec); heightSize = MeasureSpec.getSize(heightMeasureSpec); } @Override protected void onDraw(final Canvas canvas) { super.onDraw(canvas); if (background != null) { BitmapDrawable bd = (BitmapDrawable) background; final Bitmap bitmap = bd.getBitmap(); final Matrix matrix = new Matrix(); bitmapCopy = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); /** * float sx, float sy, float px, float py * * sx,sy x,y方向缩放比例 * px,py 以px py为轴心进行缩放 * 放大比例加了默认的orgFrac.是为了在还没有开始缩放时 * 放图片能够填充控件.如果图片过小的话,可能控件和图片 * 之间会有边界空白 * * 注意: 这里的px py :matrix作用于哪个对象上,那么px,py就是对象上的坐标点 * 如 : 这里就是 bitmapCopy 上的px,py坐标点. */ matrix.setScale(orgFrac + scal, 1, bitmapCopy.getWidth() / 2, bitmapCopy.getHeight() / 2); canvas.drawBitmap(bitmapCopy, matrix, null); } } /** * 开始缩放 * * @param drawableId 需要放大的背景图片 */ public void startScale(int drawableId) { background = getResources().getDrawable(drawableId); if (background == null) { throw new RuntimeException("background must not null"); } else { ValueAnimator animator = ValueAnimator.ofFloat(0, 1); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float fraction = (float) animation.getAnimatedValue(); scal = (float) (0.5 * fraction); invalidate(); } }); animator.setDuration(5000); animator.setInterpolator(new BounceInterpolator()); animator.start(); } } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downY = event.getY(); downX = event.getX(); break; case MotionEvent.ACTION_UP: float upY = event.getY(); float upX = event.getX(); if (Math.abs(upY - downY) < 5 && Math.abs(upX - downX) < 5) { listener.backgroundClick(); } break; } return true; } OnBackgroundCilckListener listener; /** * 点击事件的监听 * * @param listener */ public void addBackgroundCilckListener(OnBackgroundCilckListener listener) { this.listener = listener; } public interface OnBackgroundCilckListener { void backgroundClick(); } }

跑起来

image = (ScaleImage) findViewById(R.id.image); image.startScale(R.drawable.parallax_img); image.addBackgroundCilckListener(new ScaleImage.OnBackgroundCilckListener() { @Override public void backgroundClick() { } });

小提琴家

matrix使用待续

好了.直接使用控件,我们将资源文件中的Drawable传入就可以了.

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-07-29 20:13:53

Android 背景图片的缩放实现的相关文章

css 背景图片自动缩放实例

默认情况下,背景属性是平铺的,如果背景图片较大,而box小,那么就只能显示左上角那块背景.如果要让背景全部显示出来,  代码如下 复制代码 .color_checked {  float: right;  width: 16px;  height: 16px;  background: url(../images/color_check.png) center 0 no-repeat;  -webkit-background-size: cover;  -moz-background-size:

image-android背景图片可以在Eclipse中显示但是不能在仿真器中显示

问题描述 android背景图片可以在Eclipse中显示但是不能在仿真器中显示 我创建了一个背景图片,然后给下拉文件夹(low, med, high resolution)的每一项添加一个图像的副本,然后在 main.xml 中定义下面的代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/ap

从零开始学_JavaScript_系列(13)——CSS&amp;lt;2&amp;gt;(新窗口打开,背景图片填充,底文字,小提示,CSS选择器整理)

前注:图片和部分内容引用的网易云课堂的,所以,侵,私信,删. 这篇也算上周的 (10)打开一个网页时,以新窗口形式打开 将 <a href="www.baidu.com"></a> 新增属性: <a href="www.baidu.com" target="_blank"></a> 即可.       (11)关于块间的莫名空隙 假设有html代码: <div id="a"

Android app引导页(背景图片切换加各个页面动画效果)

先看效果图: 转自:http://blog.csdn.net/lowprofile_coding/article/details/48037095 1.显示三个页面的Activity  用view pager去加载三个fragment实现,控制点点点的切换,监听view pager的切换,控制fragment动画的开始跟结束,重写了view pager,实现了背景图片的移动效果. /** * 主Activity * @author ansen * @create time 2015-08-07

Android imageView图片按比例缩放

android:scaleType可控制图片的缩放方式,示例代码如下: <ImageView android:id="@+id/img" android:src="@drawable/logo" android:scaleType="centerInside" android:layout_width="60dip" android:layout_height="60dip" android:layo

java swing如何添加背景图片并能根据窗口大小进行缩放

前段时间在用JAVA SWING做个客户端的时候,有要在一块主面板上添加背景图片的需求,于是自己在网上找了些资料研究一下,有些网友说用JLabel来做,通过设置它的icon属性来实现,但个人感觉这种做法很HACK,呵呵,而且这种方法容易带来在上面的内容被遮住等等的问题,所以个人更喜欢用一个继承JPanel的类来实现的方法,其实我感觉它跟Web中的层的概念有几分相似吧,只需要把这个"层"加到面板的最下面,作为垫底的,就OK了,来看看怎样实现它: import javax.swing.JP

Android平铺背景图片

Android的图片平铺效果,主要有三种方法:1)系统API: 2)XML配置: 3)自定义绘制 方法1: 系统api实现 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic); //bitmap = Bitmap.createBitmap(100, 20, Config.ARGB_8888); BitmapDrawable drawable = new BitmapDrawable(bitmap

android 自定义ScrollView实现背景图片伸缩的实现代码及思路_Android

     用过多米音乐的都市知道, 这个UI可以上下滑动,作用嘛---无聊中可以划划解解闷,这被锤子公司老罗称谓为"情怀",其实叫"情味"更合适.嘿嘿.如今挪动互联网开展这么迅速,市场上已不再是那早期随便敲个APP放上架就能具有几十万用户的阶段了.近来苹果公司,为了怕android下载量赶超苹果商店,大势宣称:(第 500 亿个下载应用的用户就能够获得 10,000 美元的 iTunes 礼品卡,除此之外,紧随第 500 亿以后的前 50 名用户也可以获得 500

android换肤功能 如何动态获取控件中背景图片的资源id?_Android

这个是在在做一个换肤功能时遇到的问题.   对于换肤,网上都有示例,可以从别的皮肤安装包中读取所要的资源,前提是你必须先持有这个资源的引用名称,像R.drawable.background(喂,这不是废话嘛).这个换肤的方案原理就是,自身应用的资源名称是R.drawable.background,那皮肤包中应该也是这个名称,然后通过这个名称获取该资源在皮肤包中的具体id,代码: //先获取本地资源引用名称,type name是R.drawable.background中的"drawable&qu