Android 自定义PopupWindow动画效果

简介:

public class RollActivity extends Activity {
	private View view;
	private Button btn;
	private PopupWindow mPopupWindow;
	private View[] btns;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
//		LinearLayout layout=(LinearLayout) view.findViewById(R.id.layout_main);
//		//设置背景图片旋转180
//		Bitmap mBitmap=setRotate(R.drawable.bg_kuang);
//		BitmapDrawable drawable=new BitmapDrawable(mBitmap);
//		layout.setBackgroundDrawable(drawable);
        
        btn=(Button) this.findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				showPopupWindow(btn);
			}
        	
        });
        
        initPopupWindow(R.layout.popwindow);

    }
    
	private void initPopupWindow(int resId){
		LayoutInflater mLayoutInflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
	    view = mLayoutInflater.inflate(resId, null);
	        
		mPopupWindow = new PopupWindow(view, 400,LayoutParams.WRAP_CONTENT);
//		mPopupWindow.setBackgroundDrawable(new BitmapDrawable());//必须设置background才能消失
		mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_frame));
		mPopupWindow.setOutsideTouchable(true);
		
		//自定义动画
//		mPopupWindow.setAnimationStyle(R.style.PopupAnimation);
		//使用系统动画
		mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
		mPopupWindow.update();
		mPopupWindow.setTouchable(true);
		mPopupWindow.setFocusable(true);
		
		btns=new View[3];
		btns[0]=view.findViewById(R.id.btn_0);
		btns[1]=view.findViewById(R.id.btn_1);
		btns[2]=view.findViewById(R.id.btn_2);
		btns[0].setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//doSomething
			}
		});
		btns[1].setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//doSomething
			}
		});
		btns[2].setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//doSomething
			}
		});
	}
	private void showPopupWindow(View view) {
		if(!mPopupWindow.isShowing()){
//			mPopupWindow.showAsDropDown(view,0,0);
			mPopupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
		}
	}
	public Bitmap setRotate(int resId) {
		Matrix mFgMatrix = new Matrix();
		Bitmap mFgBitmap = BitmapFactory.decodeResource(getResources(), resId);
		mFgMatrix.setRotate(180f);
		return mFgBitmap=Bitmap.createBitmap(mFgBitmap, 0, 0, 
				mFgBitmap.getWidth(), mFgBitmap.getHeight(), mFgMatrix, true);
	}
}

PopupWindow的布局popwindow.xml 
注意3个LinearLayout里必须设置clickable和background,这样当点击上去的时候才会有点击效果。 
android:clickable="true" 
android:background="@drawable/state_btn_pressed"
 

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout 
 		xmlns:android="http://schemas.android.com/apk/res/android"
 		android:layout_width="fill_parent"
		android:layout_height="wrap_content" 
		android:orientation="horizontal"
		android:id="@+id/layout_main"
		>
		<LinearLayout android:layout_width="fill_parent"
			android:layout_height="wrap_content"
			android:orientation="vertical"
			android:gravity="center_horizontal"
			android:clickable="true"
			android:background="@drawable/state_btn_pressed"
			android:layout_weight="1"
			android:id="@+id/btn_0"
			>
			<ImageView android:layout_width="wrap_content"
				android:layout_height="wrap_content" 
				android:scaleType="fitCenter"
				android:src="@drawable/ic_call"
				>
			</ImageView>
			<TextView android:layout_width="wrap_content"
				android:layout_height="wrap_content" 
				android:textColor="#000000"
				android:textSize="18px"
				android:text="电话">
			</TextView>
		</LinearLayout>
		<LinearLayout android:layout_width="fill_parent"
			android:layout_height="wrap_content"
			android:orientation="vertical"
			android:gravity="center_horizontal"
			android:clickable="true"
			android:background="@drawable/state_btn_pressed"
			android:layout_weight="1"
			android:id="@+id/btn_1"
			>
			<ImageView android:layout_width="wrap_content"
				android:layout_height="wrap_content" 
				android:scaleType="fitCenter"
				android:src="@drawable/ic_home"
				>
			</ImageView>
			<TextView android:layout_width="wrap_content"
				android:layout_height="wrap_content" 
				android:textColor="#000"
				android:textSize="18px"
				android:text="空间">
			</TextView>
		</LinearLayout>
		
		<LinearLayout android:layout_width="fill_parent"
			android:layout_height="wrap_content"
			android:orientation="vertical"
			android:gravity="center_horizontal"
			android:clickable="true"
			android:background="@drawable/state_btn_pressed"
			android:layout_weight="1"
			android:id="@+id/btn_2"
			>
			<ImageView android:layout_width="wrap_content"
				android:layout_height="wrap_content" 
				android:scaleType="fitCenter"
				android:src="@drawable/ic_sms"
				>
			</ImageView>
			<TextView android:layout_width="wrap_content"
				android:layout_height="wrap_content" 
				android:textColor="#000"
				android:textSize="18px"
				android:text="短信"
				>
			</TextView>
		</LinearLayout>
</LinearLayout>

state_btn_pressed.xml,点击的效果: 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
        android:drawable="@drawable/bg_btn_pressed"
        android:padding="0dp"/>
</selector>

Android 模仿迅雷的 PopupWindow 出现/消失动画  
出现:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
	<scale android:fromXScale="0.6" android:toXScale="1.1"
		android:fromYScale="0.6" android:toYScale="1.1" android:pivotX="50%"
		android:pivotY="50%" android:duration="200" />
	<scale android:fromXScale="1.0" android:toXScale="0.91"
		android:fromYScale="1.0" android:toYScale="0.91" android:pivotX="50%"
		android:pivotY="50%" android:duration="400" android:delay="200" />
	<alpha android:interpolator="@android:anim/linear_interpolator"
		android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="400" />
</set>

消失: 

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
	<scale android:fromXScale="1.0" android:toXScale="1.25"
		android:fromYScale="1.0" android:toYScale="1.25" android:pivotX="50%"
		android:pivotY="50%" android:duration="200" />
	<scale android:fromXScale="1.0" android:toXScale="0.48"
		android:fromYScale="1.0" android:toYScale="0.48" android:pivotX="50%"
		android:pivotY="50%" android:duration="400" android:delay="200" />
	<alpha android:interpolator="@android:anim/linear_interpolator"
		android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="400" />
</set>

最后用下面的 XML 封装: 

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<style name="PopupAnimation" parent="android:Animation"
		mce_bogus="1">
		<item name="android:windowEnterAnimation">@anim/anim_dialog_show</item>
		<item name="android:windowExitAnimation">@anim/anim_dialog_hide</item>
	</style>
</resources>

DraweRoll.rar  (111 KB)
相关文章
|
4月前
|
Android开发 开发者
Android利用SVG实现动画效果
本文介绍了如何在Android中利用SVG实现动画效果。首先通过定义`pathData`参数(如M、L、Z等)绘制一个简单的三角形SVG图形,然后借助`objectAnimator`实现动态的线条绘制动画。文章详细讲解了从配置`build.gradle`支持VectorDrawable,到创建动画文件、关联SVG与动画,最后在Activity中启动动画的完整流程。此外,还提供了SVG绘制原理及工具推荐,帮助开发者更好地理解和应用SVG动画技术。
199 30
|
4月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
387 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
4月前
|
API Android开发 开发者
Android颜色渐变动画效果的实现
本文介绍了在Android中实现颜色渐变动画效果的方法,重点讲解了插值器(TypeEvaluator)的使用与自定义。通过Android自带的颜色插值器ArgbEvaluator,可以轻松实现背景色的渐变动画。文章详细分析了ArgbEvaluator的核心代码,并演示了如何利用Color.colorToHSV和Color.HSVToColor方法自定义颜色插值器MyColorEvaluator。最后提供了完整的源码示例,包括ColorGradient视图类和MyColorEvaluator类,帮助开发者更好地理解和应用颜色渐变动画技术。
127 3
|
4月前
|
Android开发
Android自定义view之利用PathEffect实现动态效果
本文介绍如何在Android自定义View中利用`PathEffect`实现动态效果。通过改变偏移量,结合`PathEffect`的子类(如`CornerPathEffect`、`DashPathEffect`、`PathDashPathEffect`等)实现路径绘制的动态变化。文章详细解析了各子类的功能与参数,并通过案例代码展示了如何使用`ComposePathEffect`组合效果,以及通过修改偏移量实现动画。最终效果为一个菱形图案沿路径运动,源码附于文末供参考。
|
4月前
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
205 65
Android自定义view之网易云推荐歌单界面
|
4月前
|
XML 前端开发 Android开发
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
492 84
|
4月前
|
Android开发 开发者
Android SVG动画详细例子
本文详细讲解了在Android中利用SVG实现动画效果的方法,通过具体例子帮助开发者更好地理解和应用SVG动画。文章首先展示了动画的实现效果,接着回顾了之前的文章链接及常见问题(如属性名大小写错误)。核心内容包括:1) 使用阿里图库获取SVG图形;2) 借助工具将SVG转换为VectorDrawable;3) 为每个路径添加动画绑定属性;4) 创建动画文件并关联SVG;5) 在ImageView中引用动画文件;6) 在Activity中启动动画。文末还提供了完整的代码示例和源码下载链接,方便读者实践操作。
261 65
|
4月前
|
XML Java Maven
Android线条等待动画JMWorkProgress(可添加依赖直接使用)
这是一篇关于Android线条等待动画JMWorkProgress的教程文章,作者计蒙将其代码开源至GitHub,提升可读性。文章介绍了如何通过添加依赖库使用该动画,并详细讲解了XML与Java中的配置方法,包括改变线条颜色、宽度、添加文字等自定义属性。项目已支持直接依赖集成(`implementation &#39;com.github.Yufseven:JMWorkProgress:v1.0&#39;`),开发者可以快速上手实现炫酷的等待动画效果。文末附有GitHub项目地址,欢迎访问并点赞支持!
115 26
|
4月前
|
前端开发 Android开发 UED
讲讲Android为自定义view提供的SurfaceView
本文详细介绍了Android中自定义View时使用SurfaceView的必要性和实现方式。首先分析了在复杂绘制逻辑和高频界面更新场景下,传统View可能引发卡顿的问题,进而引出SurfaceView作为解决方案。文章通过Android官方Demo展示了SurfaceView的基本用法,包括实现`SurfaceHolder.Callback2`接口、与Activity生命周期绑定、子线程中使用`lockCanvas()`和`unlockCanvasAndPost()`方法完成绘图操作。
|
Java Android开发 UED
Android的动画效果浅解析
毕业设计中用到了一些动画效果,个人感觉还是蛮有用的。所以记录一下,是很多地方可以用的小而实用的动画效果。 首先要介绍的是只有在两个Activity跳转之间才能用到的overridePendingTransition,从字面意思来看,它跟切换有关。
1148 0

热门文章

最新文章