点击缩小的自定义布局

实现效果两个文件

ScaleAnimationHelper

package school.zn.publib.view.RelativeLayout;

import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.ScaleAnimation;

public class ScaleAnimationHelper {
	private static int DURATION = 200;
	private float scale ;
	ScaleAnimation myAnimation_Scale;

	public ScaleAnimationHelper(float scale_size) {
		scale = scale_size;
	}

	// 放大的类,不需要设置监听器
	public void ScaleOutAnimation(View view) {
		myAnimation_Scale = new ScaleAnimation(scale, 1.0f, scale, 1f,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				0.5f);
		myAnimation_Scale.setInterpolator(new AccelerateInterpolator());
		AnimationSet aa = new AnimationSet(true);
		aa.addAnimation(myAnimation_Scale);
		aa.setDuration(DURATION);
		aa.setFillAfter(true);
		view.startAnimation(aa);
	}

	public void ScaleInAnimation(View view) {
		myAnimation_Scale = new ScaleAnimation(1.0f, scale, 1.0f, scale,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				0.5f);
		myAnimation_Scale.setInterpolator(new AccelerateInterpolator());
		AnimationSet aa = new AnimationSet(true);
		aa.addAnimation(myAnimation_Scale);
		aa.setDuration(DURATION);
		aa.setFillAfter(true);
		view.startAnimation(aa);
	}
}

HomeRelativeLayout

package school.zn.publib.view.RelativeLayout;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;

import school.zn.publib.R;

@SuppressLint("HandlerLeak")
public class HomeRelativeLayout extends RelativeLayout {

	private ScaleAnimationHelper scaleAnimationHelper;
	private float scale_size = 1.0f;
    private boolean isnormal=true;

	private OnViewClick mOnViewClick;

	public HomeRelativeLayout(Context context, AttributeSet attrs) {
		super(context, attrs);

		TypedArray ta = context.obtainStyledAttributes(attrs,
				R.styleable.HomeRelativeLayout);
		scale_size = ta.getFloat(R.styleable.HomeRelativeLayout_scale_size,
				1.0f);
		scaleAnimationHelper = new ScaleAnimationHelper(scale_size);
	}

	public HomeRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		TypedArray ta = context.obtainStyledAttributes(attrs,
				R.styleable.HomeRelativeLayout);
		scale_size = ta.getFloat(R.styleable.HomeRelativeLayout_scale_size,
				1.0f);
		scaleAnimationHelper = new ScaleAnimationHelper(scale_size);
	}

	public void setOnViewClick(OnViewClick onViewClick) {
		mOnViewClick = onViewClick;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		super.onTouchEvent(event);
		switch (event.getAction() & MotionEvent.ACTION_MASK) {
		case MotionEvent.ACTION_DOWN:
            if(isnormal) {
                scaleAnimationHelper.ScaleInAnimation(HomeRelativeLayout.this);
                isnormal=false;
            }
			break;
		case MotionEvent.ACTION_MOVE:
            if(!isnormal) {
                scaleAnimationHelper.ScaleOutAnimation(HomeRelativeLayout.this);
                isnormal=true;
            }
			break;
		case MotionEvent.ACTION_UP:
			int[] location = new int[2];
			HomeRelativeLayout.this.getLocationOnScreen(location);

			if (inRangeOfView(HomeRelativeLayout.this, event)
					&& mOnViewClick != null) {
				mOnViewClick.onClick(HomeRelativeLayout.this.getId());
			}

            if(!isnormal) {
                scaleAnimationHelper.ScaleOutAnimation(HomeRelativeLayout.this);
                isnormal=true;
            }
			break;
		}
		return true;
	}

	private boolean inRangeOfView(View view, MotionEvent ev) {

		float X = ev.getRawX();
		float Y = ev.getRawY();

		int[] location = new int[2];
		view.getLocationOnScreen(location);
		int view_fromx = location[0];
		int view_tox = location[0] + view.getWidth();

		int view_fromy = location[1];
		int view_toy = location[1] + view.getHeight();

		if (X < view_fromx || X > (view_tox) || Y < view_fromy
				|| Y > (view_toy)) {
			return false;
		}
		return true;
	}

	public interface OnViewClick {
		public void onClick(int viewID);
	}
}

用法:

布局中使用

      <school.zn.publib.view.RelativeLayout.HomeRelativeLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_marginLeft="1dp"
                android:layout_marginRight="1dp"
                android:layout_weight="1.0"
                android:background="@drawable/red_corners_big"
                scale:scale_size="0.95" >

                <TextView
                    android:layout_marginTop="20dp"
                    android:layout_centerHorizontal="true"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="考 勤"
                    style="@style/Tab_Text"
                />
                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:src="@mipmap/common_btn_homepage_hotel"/>

            </school.zn.publib.view.RelativeLayout.HomeRelativeLayout>
时间: 2024-10-17 18:20:52

点击缩小的自定义布局的相关文章

Notification的基本用法以及使用RemoteView实现自定义布局

Notification的作用 Notification是一种全局效果的通知,在系统的通知栏中显示.既然作为通知,其基本作用有: 显示接收到短消息.即时信息等 显示客户端的推送(广告.优惠.新闻等) 显示正在进行的事物(后台运行的程序,如音乐播放进度.下载进度) Notification的基本操作: Notification的基本操作主要有创建.更新和取消三种.一个Notification的必要属性有三项,如果不设置的话在运行时会抛出异常: 小图标,通过setSmallIcon方法设置 标题,通

用PopupWindow实现弹出菜单(弹出的菜单采用自定义布局)

     用PopupWindow实现弹出菜单是一个比较好的方式.当然我们还有一个类PopupMenu也能实现弹出菜单,但那个太过于局限了,所以不是很推荐. 这个实例的效果是这样的:点击按钮后,一个菜单从屏幕的右边滑入到屏幕中,点击按钮/空白处后菜单消失. 布局文件时一个按钮,我就不贴出代码了.下面是菜单的布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&

AcitonBar 自定义布局

Android系统中ActionBar默认的布局不美观且难于控制,通过为ActionBar自定义布局的方式可以灵活控制ActionBar. 自定义Activity主题和ActionBar样式 在新建的android工程的res/values/styles.xml添加自定义ActionBar样式的代码和自定义Activity主题的代码,并在AndroidMainfest.xml中给需要使用该自定义ActionBar的Activity中加入该主题: (1)自定义ActionBar样式代码如下: <!

利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能

利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能1.在界面上添加几个checkbox和一个接收动态添加div的容器 <div> 功能区域 <br /> <input id="1" type="checkbox" value="新闻" name="11" />新闻 <input id="2" type="checkbox"

Android自定义布局的三种实现方式

在毕设项目中多处用到自定义布局,一直打算总结一下自定义布局的实现方式,今天就来总结一下吧.在此之前学习了郭霖大神博客上面关于自定义View的几篇博文,感觉受益良多,本文中就参考了其中的一些内容. 总结来说,自定义布局的实现有三种方式,分别是:组合控件.自绘控件和继承控件.下面将分别对这三种方式进行介绍. (一)组合控件 组合控件,顾名思义就是将一些小的控件组合起来形成一个新的控件,这些小的控件多是系统自带的控件.比如很多应用中普遍使用的标题栏控件,其实用的就是组合控件,那么下面将通过实现一个简单

Android 自定义布局 性能问题 初探

大家在写android 代码的时候,基本上都使用过如下几种布局 RelativeLayout,LinearLayout, FrameLayout 但是很多时候 这几种布局 也无法满足我们的使用.于是我们会考虑用自定义布局,使用自定义布局会有几个优点 比如可以减少view的使用啊,让ui显示的更加有效率啊,以及实现一些原生控件无法实现的效果. 我们首先去github上 下载一个开源项目 https://github.com/lucasr/android-layout-samples 注意这个项目是

ActionBar 自定义布局定义

Android系统中ActionBar默认的布局不美观且难于控制,通过为ActionBar自定义布局的方式可以灵活控制ActionBar. 效果: 工具/原料 android集成开发环境eclipse.ADT android sdk 3.0及以上 方法/步骤 自定义Activity主题和ActionBar样式 在新建的android工程的res/values/styles.xml添加自定义ActionBar样式的代码和自定义Activity主题的代 码,并在AndroidMainfest.xml

Android开发学习之路--UI之自定义布局和控件

新的一年已经开始了,今天已经是初二了,两天没有学习了,还是要来继续学习下.一般手机的title都是actionbar,就像iphone一样可以后退,可以编辑.这里自定义布局就来实现下这个功能,首先准备下三张图片,一张用来当作背景,两张分别表示后退和编辑.新建工程UICostomViewsTest,然后自动创建工程后,新建title.xml,编写代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearL

SharePoint 2013 设置自定义布局页

在SharePoint中,我们经常需要自定义登陆页面.错误页面.拒绝访问等:不知道大家如何操作,以前自己经常在原来页面改或者跳转,其实SharePoint为我们提供了PowerShell命令,来修改这些页面为我们自己的布局页. 具体设置,可以通过PowerShell命令的Identity参数来修改,可以修改的参数主要包括None.AccessDenied.Confirmation.Error.Login.RequestAccess.Signout 或WebDeleted. 设置自定义布局页的映射