Android實現背景透明度漸變的效果,類似於分享底部的彈出框
阿新 • • 發佈:2019-01-03
實現背景透明度漸變的效果,類似於分享底部的彈出框
這是公司最近寫的一個專案,其中的一個自定義分享模組,剛開始實現的效果比較簡單,背景透明度沒有漸變,而是隨著底部分享的彈出框而一起彈出,看起來比較生硬,使用者體驗不是很好,現在要實現的效果就是類似於SharedSDK底部分享彈出框的效果,相信大家都用過SharedSDK,也見過他的分享彈出框的效果!廢話不多說了,看張效果圖,然後直接上程式碼!
程式碼塊
1.這個是主介面
package com.example.bg.share.selfdefinitionshareanimaiton;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button bt_share;
private ImageView iv_all ;
private static PopupWindow mPop;
private View mPopupView;
private PopupWindow mPopupWindow;
private LinearLayout qzone;
private LinearLayout friend_circle;
private LinearLayout sina;
private LinearLayout weixin_goodfriend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initEventListener();
}
private void initView() {
bt_share = (Button) findViewById(R.id.bt_share);
iv_all = (ImageView) findViewById(R.id.iv_all);
/**
* 分享的那個popupWindow
*/
//獲取得到PopupWindow的佈局檔案
mPopupView = View.inflate(this, R.layout.layout_share_popupwindow, null);
qzone = (LinearLayout) mPopupView.findViewById(R.id.qzone);
friend_circle = (LinearLayout) mPopupView.findViewById(R.id.friend_circle);
sina = (LinearLayout) mPopupView.findViewById(R.id.sina);
weixin_goodfriend = (LinearLayout) mPopupView.findViewById(R.id.weixin_goodfriend);
}
private void initData() {
}
private void initEventListener() {
bt_share.setOnClickListener(this);
qzone.setOnClickListener(this);
friend_circle.setOnClickListener(this);
sina.setOnClickListener(this);
weixin_goodfriend.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()) {
case R.id.bt_share: //分享
propetyAnim(iv_all);
mPopupWindow = showPopWindow(view, mPopupView, this, iv_all);
break;
case R.id.qzone://分享到qq空間!
break;
case R.id.friend_circle://分享到微信朋友圈!
break;
case R.id.sina://分享到新浪微博!
break;
case R.id.weixin_goodfriend://分享到微信好友!
break;
default:
break;
}
}
/**
半透明背景出現的動畫
*/
private void propetyAnim(ImageView iv) {
ObjectAnimator animator = ObjectAnimator.ofFloat(iv, "alpha", 0, 0.2f, 0.5f, 0.7f, 0.9f, 1);
animator.setDuration(500);
animator.setRepeatCount(0);
animator.start();
iv.setVisibility(View.VISIBLE);
}
/**
* 半透明背景消失的動畫
* @param iv
*/
public static void propetyAnim2(final ImageView iv){
ObjectAnimator animator = ObjectAnimator.ofFloat(iv,"alpha",1,0.9f,0.7f,0.5f,0.2f,0);
animator.setDuration(500);
animator.setRepeatCount(0);
animator.start();
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
iv.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
/**
* 顯示PopupWindow
* @param parent
* @param view
* @return
*/
public static PopupWindow showPopWindow(View parent, View view, Context context, final ImageView iv_all) {
mPop = new PopupWindow(view,
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mPop.setOutsideTouchable(true);
mPop.setFocusable(true);
mPop.setBackgroundDrawable(new ColorDrawable(0));
mPop.setAnimationStyle(R.style.AnimBottom);
mPop.showAtLocation(parent, Gravity.TOP, 0, 0);
//mPop.showAsDropDown(v,0,0);
view.setFocusable(true); // 這個很重要
view.setFocusableInTouchMode(true);
mPop.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
propetyAnim2(iv_all);
mPop = null;
}
});
// 重寫onKeyListener
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
mPop.dismiss();
return true;
}
return false;
}
});
// 點選其他地方消失
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if (mPop != null && mPop.isShowing()) {
mPop.dismiss();
}
return false;
}
});
return mPop;
}
}
2.這個是主介面的佈局檔案
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/bt_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="分享"/>
<ImageView
android:id="@+id/iv_all"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#44000000"
android:visibility="gone">
</ImageView>
</RelativeLayout>
3.這個是PopupWindow的佈局檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="235dp"
android:orientation="vertical">
<View
android:id="@+id/view1"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/layout_bg" />
<View
android:id="@+id/child_top"
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="@android:color/white" />
<LinearLayout
android:id="@+id/ll_share_item"
android:layout_width="match_parent"
android:layout_height="140dp"
android:background="@android:color/white"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/qzone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/qzone" />
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="QQ空間"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/friend_circle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/friend_cirle" />
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="朋友圈"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/sina"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/sina_weibo" />
<TextView
android:id="@+id/tv3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="新浪微博"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/weixin_goodfriend"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/weixin_goodfriend" />
<TextView
android:id="@+id/tv4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="微信好友"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_below="@id/ll"
android:background="#22000000" />
<View
android:id="@+id/view2"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/layout_bg" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:id="@+id/rl_cancel">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:text="取消"
android:textColor="#0000ff"
android:textSize="15sp" />
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/layout_bg" />
</LinearLayout>
</LinearLayout>
4.在colors.xml中加入這兩種顏色
<color name="white">#ffffff</color>
<color name="layout_bg">#f0f0f0</color>
5.在styles.xml中加入這個樣式
<!--自定義分享的底部彈出-->
<style name="AnimBottom" parent="@android:style/Animation">
<item name="android:windowEnterAnimation">@anim/push_bottom_in</item>
<item name="android:windowExitAnimation">@anim/push_bottom_out</item>
</style>
對應的兩種動畫
1)push_bottom_in
<?xml version="1.0" encoding="utf-8"?>
<!-- 上下滑入式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="280"
android:fromYDelta="100%p"
android:toYDelta="0"
/>
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="200"
/>
</set>
2)push_bttom_out
<?xml version="1.0" encoding="utf-8"?>
<!-- 上下滑入式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="280"
android:fromYDelta="0"
android:toYDelta="50%p" />
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="200"
/>
</set>
好的到這裡已ok,本人技術水平有限,如有錯誤,歡迎各位大牛指正!