—> AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.NewQuickAction.android" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".QuickActionActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Example1Activity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW" /> </intent-filter> </activity> <activity android:name=".Example2Activity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW" /> </intent-filter> </activity> </application> </manifest>
res/values
styles.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="Animations" /> <!-- PopDownMenu --> <style name="Animations.PopDownMenu" /> <style name="Animations.PopDownMenu.Left"> <item name="@android:windowEnterAnimation">@anim/grow_from_topleft_to_bottomright</item> <item name="@android:windowExitAnimation">@anim/shrink_from_bottomright_to_topleft</item> </style> <style name="Animations.PopDownMenu.Right"> <item name="@android:windowEnterAnimation">@anim/grow_from_topright_to_bottomleft</item> <item name="@android:windowExitAnimation">@anim/shrink_from_bottomleft_to_topright</item> </style> <style name="Animations.PopDownMenu.Center"> <item name="@android:windowEnterAnimation">@anim/grow_from_top</item> <item name="@android:windowExitAnimation">@anim/shrink_from_bottom</item> </style> <!-- PopUpMenu --> <style name="Animations.PopUpMenu" /> <style name="Animations.PopUpMenu.Left"> <item name="@android:windowEnterAnimation">@anim/grow_from_bottomleft_to_topright</item> <item name="@android:windowExitAnimation">@anim/shrink_from_topright_to_bottomleft</item> </style> <style name="Animations.PopUpMenu.Right"> <item name="@android:windowEnterAnimation">@anim/grow_from_bottomright_to_topleft</item> <item name="@android:windowExitAnimation">@anim/shrink_from_topleft_to_bottomright</item> </style> <style name="Animations.PopUpMenu.Center"> <item name="@android:windowEnterAnimation">@anim/grow_from_bottom</item> <item name="@android:windowExitAnimation">@anim/shrink_from_top</item> </style> </resources>
res/layout
action_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical|center_horizontal" android:paddingTop="0dip" android:paddingBottom="0dip" android:paddingLeft="20dip" android:paddingRight="20dip" android:clickable="true" android:background="@drawable/quickaction_slider_btn"> <ImageView android:id="@+id/iv_icon" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv_title" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_vertical|center_horizontal" android:textSize="12sp" android:textColor="#666"/> </LinearLayout>
example1.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="17dp" android:textStyle="bold" android:text="New Quickaction Demo"/> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:padding="30dp" android:text="Button 1"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"/> <Button android:id="@+id/btn2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="30dp" android:text="Button 2" /> </LinearLayout>
example2.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="17dp" android:textStyle="bold" android:text="New Quickaction Demo"/> <ListView android:id="@+id/l_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp"/> </LinearLayout>
list.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="5dp" android:paddingRight="5dp" android:paddingTop="10dp" android:paddingBottom="10dp" android:gravity="center_vertical"> <ImageView android:id="@+id/i_more" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_list_more"/> <TextView android:id="@+id/t_name" android:layout_alignParentLeft="true" android:layout_toLeftOf="@id/i_more" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Text"/> </RelativeLayout>
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="17dp" android:textStyle="bold" android:text="New Quickaction Demo"/> <Button android:id="@+id/btn1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Example 1"/> <Button android:id="@+id/btn2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="Example 2 (Listview)"/> </LinearLayout>
quickaction.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <FrameLayout android:layout_marginTop="10dip" android:id="@+id/header2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/quickaction_top_frame"/> <ImageView android:id="@+id/arrow_up" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/quickaction_arrow_up" /> <HorizontalScrollView android:id="@+id/scroll" android:layout_width="fill_parent" android:layout_height="wrap_content" android:fadingEdgeLength="0dip" android:layout_below="@id/header2" android:paddingLeft="1dip" android:background="@drawable/quickaction_slider_background" android:scrollbars="none"> <LinearLayout android:id="@+id/tracks" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="4dip" android:paddingBottom="4dip" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/quickaction_slider_grip_left" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/quickaction_slider_grip_right" /> </LinearLayout> </HorizontalScrollView> <FrameLayout android:id="@+id/footer" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/scroll" android:background="@drawable/quickaction_bottom_frame" /> <ImageView android:id="@+id/arrow_down" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="-1dip" android:layout_below="@id/footer" android:src="@drawable/quickaction_arrow_down" /> </RelativeLayout>
res/drawable
quickaction_slider_btn.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:dither="true"> <item android:state_checked="true" android:drawable="@drawable/quickaction_slider_btn_on" /> <item android:state_window_focused="false" android:drawable="@drawable/quickaction_slider_btn_normal" /> <item android:state_pressed="true" android:drawable="@drawable/quickaction_slider_btn_pressed" /> <item android:state_focused="true" android:drawable="@drawable/quickaction_slider_btn_selected" /> <item android:drawable="@drawable/quickaction_slider_btn_normal" /> </selector>
res/anim
grow_from_bottom.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.3" android:toXScale="1.0" android:fromYScale="0.3" android:toYScale="1.0" android:pivotX="50%" android:pivotY="100%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/decelerate_interpolator" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
grow_from_bottomleft_to_topright.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.3" android:toXScale="1.0" android:fromYScale="0.3" android:toYScale="1.0" android:pivotX="0%" android:pivotY="50%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/decelerate_interpolator" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
grow_from_bottomright_to_topleft.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.3" android:toXScale="1.0" android:fromYScale="0.3" android:toYScale="1.0" android:pivotX="100%" android:pivotY="50%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/decelerate_interpolator" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
grow_from_top.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.3" android:toXScale="1.0" android:fromYScale="0.3" android:toYScale="1.0" android:pivotX="50%" android:pivotY="0%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/decelerate_interpolator" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
grow_from_topleft_to_bottomright.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.3" android:toXScale="1.0" android:fromYScale="0.3" android:toYScale="1.0" android:pivotX="0%" android:pivotY="0%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/decelerate_interpolator" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
grow_from_topright_to_bottomleft.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.3" android:toXScale="1.0" android:fromYScale="0.3" android:toYScale="1.0" android:pivotX="100%" android:pivotY="0%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/decelerate_interpolator" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
rail.xml
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="100%p" android:toXDelta="0" android:duration="325" />
shrink_from_bottom.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="1.0" android:toXScale="0.3" android:fromYScale="1.0" android:toYScale="0.3" android:pivotX="50%" android:pivotY="0%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/accelerate_interpolator" android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
shrink_from_bottomleft_to_topright.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="1.0" android:toXScale="0.3" android:fromYScale="1.0" android:toYScale="0.3" android:pivotX="100%" android:pivotY="0%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/accelerate_interpolator" android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
shrink_from_bottomright_to_topleft.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="1.0" android:toXScale="0.3" android:fromYScale="1.0" android:toYScale="0.3" android:pivotX="0%" android:pivotY="0%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/accelerate_interpolator" android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
shrink_from_top.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="1.0" android:toXScale="0.3" android:fromYScale="1.0" android:toYScale="0.3" android:pivotX="50%" android:pivotY="100%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/accelerate_interpolator" android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
shrink_from_topleft_to_bottomright.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="1.0" android:toXScale="0.3" android:fromYScale="1.0" android:toYScale="0.3" android:pivotX="100%" android:pivotY="100%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/accelerate_interpolator" android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
shrink_from_topright_to_bottomleft.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="1.0" android:toXScale="0.3" android:fromYScale="1.0" android:toYScale="0.3" android:pivotX="0%" android:pivotY="100%" android:duration="@android:integer/config_shortAnimTime" /> <alpha android:interpolator="@android:anim/accelerate_interpolator" android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@android:integer/config_shortAnimTime" /> </set>
ActionItem.java
package com.NewQuickAction.android; import android.graphics.drawable.Drawable; import android.graphics.Bitmap; public class ActionItem { private Drawable icon; private Bitmap thumb; private String title; private int actionId = -1; private boolean selected; private boolean sticky; public ActionItem(int actionId, String title, Drawable icon) { this.title = title; this.icon = icon; this.actionId = actionId; } public ActionItem() { this(-1, null, null); } public ActionItem(int actionId, String title) { this(actionId, title, null); } public ActionItem(Drawable icon) { this(-1, null, icon); } public ActionItem(int actionId, Drawable icon) { this(actionId, null, icon); } public void setTitle(String title) { this.title = title; } public String getTitle() { return this.title; } public void setIcon(Drawable icon) { this.icon = icon; } public Drawable getIcon() { return this.icon; } public void setActionId(int actionId) { this.actionId = actionId; } public int getActionId() { return actionId; } public void setSticky(boolean sticky) { this.sticky = sticky; } public boolean isSticky() { return sticky; } public void setSelected(boolean selected) { this.selected = selected; } public boolean isSelected() { return this.selected; } public void setThumb(Bitmap thumb) { this.thumb = thumb; } public Bitmap getThumb() { return this.thumb; } }
Example1Activity.java
package com.NewQuickAction.android; import android.os.Bundle; import android.app.Activity; import android.widget.Button; import android.widget.Toast; import android.view.View; import android.view.View.OnClickListener; public class Example1Activity extends Activity { private static final int ID_ADD = 1; private static final int ID_ACCEPT = 2; private static final int ID_UPLOAD = 3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.example1); ActionItem addItem = new ActionItem(ID_ADD, "Add", getResources().getDrawable(R.drawable.ic_add)); ActionItem acceptItem = new ActionItem(ID_ACCEPT, "Accept", getResources().getDrawable(R.drawable.ic_accept)); ActionItem uploadItem = new ActionItem(ID_UPLOAD, "Upload", getResources().getDrawable(R.drawable.ic_up)); //use setSticky(true) to disable QuickAction dialog being dismissed after an item is clicked uploadItem.setSticky(true); final QuickAction mQuickAction = new QuickAction(this); mQuickAction.addActionItem(addItem); mQuickAction.addActionItem(acceptItem); mQuickAction.addActionItem(uploadItem); //setup the action item click listener mQuickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() { @Override public void onItemClick(QuickAction quickAction, int pos, int actionId) { ActionItem actionItem = quickAction.getActionItem(pos); if (actionId == ID_ADD) { Toast.makeText(getApplicationContext(), "Add item selected", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), actionItem.getTitle() + " selected", Toast.LENGTH_SHORT).show(); } } }); mQuickAction.setOnDismissListener(new QuickAction.OnDismissListener() { @Override public void onDismiss() { Toast.makeText(getApplicationContext(), "Ups..dismissed", Toast.LENGTH_SHORT).show(); } }); Button btn1 = (Button) this.findViewById(R.id.btn1); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mQuickAction.show(v); } }); Button btn2 = (Button) this.findViewById(R.id.btn2); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mQuickAction.show(v); mQuickAction.setAnimStyle(QuickAction.ANIM_GROW_FROM_CENTER); } }); } }
Example2Activity.java
package com.NewQuickAction.android; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; import android.widget.PopupWindow; public class Example2Activity extends Activity { private int mSelectedRow = 0; private ImageView mMoreIv = null; private static final int ID_ADD = 1; private static final int ID_ACCEPT = 2; private static final int ID_UPLOAD = 3; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.example2); ListView mList = (ListView) findViewById(R.id.l_list); NewQAAdapter adapter = new NewQAAdapter(this); final String[] data = {"Test 01", "Test 02", "Test 03", "Test 04", "Test 05", "Test 06", "Test 07", "Test 08", "Test 09", "Test 10"}; adapter.setData(data); mList.setAdapter(adapter); ActionItem addItem = new ActionItem(ID_ADD, "Add", getResources().getDrawable(R.drawable.ic_add)); ActionItem acceptItem = new ActionItem(ID_ACCEPT, "Accept", getResources().getDrawable(R.drawable.ic_accept)); ActionItem uploadItem = new ActionItem(ID_UPLOAD, "Upload", getResources().getDrawable(R.drawable.ic_up)); final QuickAction mQuickAction = new QuickAction(this); mQuickAction.addActionItem(addItem); mQuickAction.addActionItem(acceptItem); mQuickAction.addActionItem(uploadItem); //setup the action item click listener mQuickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() { @Override public void onItemClick(QuickAction quickAction, int pos, int actionId) { ActionItem actionItem = quickAction.getActionItem(pos); if (actionId == ID_ADD) { //Add item selected Toast.makeText(getApplicationContext(), "Add item selected on row " + mSelectedRow, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), actionItem.getTitle() + " item selected on row " + mSelectedRow, Toast.LENGTH_SHORT).show(); } } }); //setup on dismiss listener, set the icon back to normal mQuickAction.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { mMoreIv.setImageResource(R.drawable.ic_list_more); } }); mList.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mSelectedRow = position; //set the selected row mQuickAction.show(view); //change the right arrow icon to selected state mMoreIv = (ImageView) view.findViewById(R.id.i_more); mMoreIv.setImageResource(R.drawable.ic_list_more_selected); } }); } }
NewQAAdapter.java
package com.NewQuickAction.android; import android.view.View; import android.view.ViewGroup; import android.view.LayoutInflater; import android.content.Context; import android.widget.BaseAdapter; import android.widget.TextView; public class NewQAAdapter extends BaseAdapter { private LayoutInflater mInflater; private String[] data; public NewQAAdapter(Context context) { mInflater = LayoutInflater.from(context); } public void setData(String[] data) { this.data = data; } @Override public int getCount() { return data.length; } @Override public Object getItem(int item) { return data[item]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list, null); holder = new ViewHolder(); holder.mTitleText = (TextView) convertView.findViewById(R.id.t_name); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.mTitleText.setText(data[position]); return convertView; } static class ViewHolder { TextView mTitleText; } }
PopupWindows.java
package com.NewQuickAction.android; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.view.View.OnTouchListener; import android.widget.PopupWindow; import android.content.Context; public class PopupWindows { protected Context mContext; protected PopupWindow mWindow; protected View mRootView; protected Drawable mBackground = null; protected WindowManager mWindowManager; public PopupWindows(Context context) { mContext = context; mWindow = new PopupWindow(context); mWindow.setTouchInterceptor(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { mWindow.dismiss(); return true; } return false; } }); mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); } protected void onDismiss() { } protected void onShow() { } protected void preShow() { if (mRootView == null) throw new IllegalStateException("setContentView was not called with a view to display."); onShow(); if (mBackground == null) mWindow.setBackgroundDrawable(new BitmapDrawable()); else mWindow.setBackgroundDrawable(mBackground); mWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); mWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); mWindow.setTouchable(true); mWindow.setFocusable(true); mWindow.setOutsideTouchable(true); mWindow.setContentView(mRootView); } public void setBackgroundDrawable(Drawable background) { mBackground = background; } public void setContentView(View root) { mRootView = root; mWindow.setContentView(root); } public void setContentView(int layoutResID) { LayoutInflater inflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); setContentView(inflator.inflate(layoutResID, null)); } public void setOnDismissListener(PopupWindow.OnDismissListener listener) { mWindow.setOnDismissListener(listener); } public void dismiss() { mWindow.dismiss(); } }
QuickAction.java
package com.NewQuickAction.android; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.widget.TextView; import android.widget.PopupWindow.OnDismissListener; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; public class QuickAction extends PopupWindows implements OnDismissListener { private ImageView mArrowUp; private ImageView mArrowDown; private Animation mTrackAnim; private LayoutInflater inflater; private ViewGroup mTrack; private OnActionItemClickListener mItemClickListener; private OnDismissListener mDismissListener; private List<ActionItem> mActionItemList = new ArrayList<ActionItem>(); private boolean mDidAction; private boolean mAnimateTrack; private int mChildPos; private int mAnimStyle; public static final int ANIM_GROW_FROM_LEFT = 1; public static final int ANIM_GROW_FROM_RIGHT = 2; public static final int ANIM_GROW_FROM_CENTER = 3; public static final int ANIM_AUTO = 4; public QuickAction(Context context) { super(context); inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mTrackAnim = AnimationUtils.loadAnimation(context, R.anim.rail); mTrackAnim.setInterpolator(new Interpolator() { public float getInterpolation(float t) { // Pushes past the target area, then snaps back into place. // Equation for graphing: 1.2-((x*1.6)-1.1)^2 final float inner = (t * 1.55f) - 1.1f; return 1.2f - inner * inner; } }); setRootViewId(R.layout.quickaction); mAnimStyle = ANIM_AUTO; mAnimateTrack = true; mChildPos = 0; } public ActionItem getActionItem(int index) { return mActionItemList.get(index); } public void setRootViewId(int id) { mRootView = (ViewGroup) inflater.inflate(id, null); mTrack = (ViewGroup) mRootView.findViewById(R.id.tracks); mArrowDown = (ImageView) mRootView.findViewById(R.id.arrow_down); mArrowUp = (ImageView) mRootView.findViewById(R.id.arrow_up); mRootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); setContentView(mRootView); } public void mAnimateTrack(boolean mAnimateTrack) { this.mAnimateTrack = mAnimateTrack; } public void setAnimStyle(int mAnimStyle) { this.mAnimStyle = mAnimStyle; } public void addActionItem(ActionItem action) { mActionItemList.add(action); String title = action.getTitle(); Drawable icon = action.getIcon(); View container = (View) inflater.inflate(R.layout.action_item, null); ImageView img = (ImageView) container.findViewById(R.id.iv_icon); TextView text = (TextView) container.findViewById(R.id.tv_title); if (icon != null) { img.setImageDrawable(icon); } else { img.setVisibility(View.GONE); } if (title != null) { text.setText(title); } else { text.setVisibility(View.GONE); } final int pos = mChildPos; final int actionId = action.getActionId(); container.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mItemClickListener != null) { mItemClickListener.onItemClick(QuickAction.this, pos, actionId); } if (!getActionItem(pos).isSticky()) { mDidAction = true; v.post(new Runnable() { @Override public void run() { dismiss(); } }); } } }); container.setFocusable(true); container.setClickable(true); mTrack.addView(container, mChildPos+1); mChildPos++; } public void setOnActionItemClickListener(OnActionItemClickListener listener) { mItemClickListener = listener; } public void show (View anchor) { preShow(); int[] location = new int[2]; mDidAction = false; anchor.getLocationOnScreen(location); Rect anchorRect = new Rect(location[0], location[1], location[0] + anchor.getWidth(), location[1] + anchor.getHeight()); mRootView.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); int rootWidth = mRootView.getMeasuredWidth(); int rootHeight = mRootView.getMeasuredHeight(); int screenWidth = mWindowManager.getDefaultDisplay().getWidth(); int xPos = (screenWidth - rootWidth) / 2; int yPos = anchorRect.top - rootHeight; boolean onTop = true; if (rootHeight > anchor.getTop()) { yPos = anchorRect.bottom; onTop = false; } showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up), anchorRect.centerX()); setAnimationStyle(screenWidth, anchorRect.centerX(), onTop); mWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos); if (mAnimateTrack) mTrack.startAnimation(mTrackAnim); } private void setAnimationStyle(int screenWidth, int requestedX, boolean onTop) { int arrowPos = requestedX - mArrowUp.getMeasuredWidth()/2; switch (mAnimStyle) { case ANIM_GROW_FROM_LEFT: mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left); break; case ANIM_GROW_FROM_RIGHT: mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right); break; case ANIM_GROW_FROM_CENTER: mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center); break; case ANIM_AUTO: if (arrowPos <= screenWidth/4) { mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left); } else if (arrowPos > screenWidth/4 && arrowPos < 3 * (screenWidth/4)) { mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center); } else { mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopDownMenu_Right : R.style.Animations_PopDownMenu_Right); } break; } } private void showArrow(int whichArrow, int requestedX) { final View showArrow = (whichArrow == R.id.arrow_up) ? mArrowUp : mArrowDown; final View hideArrow = (whichArrow == R.id.arrow_up) ? mArrowDown : mArrowUp; final int arrowWidth = mArrowUp.getMeasuredWidth(); showArrow.setVisibility(View.VISIBLE); ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams)showArrow.getLayoutParams(); param.leftMargin = requestedX - arrowWidth / 2; hideArrow.setVisibility(View.INVISIBLE); } public void setOnDismissListener(QuickAction.OnDismissListener listener) { setOnDismissListener(this); mDismissListener = listener; } @Override public void onDismiss() { if (!mDidAction && mDismissListener != null) { mDismissListener.onDismiss(); } } public interface OnActionItemClickListener { public abstract void onItemClick(QuickAction source, int pos, int actionId); } public interface OnDismissListener { public abstract void onDismiss(); } }
QuickActionActivity.java
package com.NewQuickAction.android; import android.os.Bundle; import android.content.Intent; import android.app.Activity; import android.widget.Button; import android.view.View; public class QuickActionActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button example1Btn = (Button) findViewById(R.id.btn1); Button example2Btn = (Button) findViewById(R.id.btn2); example1Btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(getApplicationContext(), Example1Activity.class)); } }); example2Btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(getApplicationContext(), Example2Activity.class)); } }); } }
your continued educational values are appreciated by our team and continued involvment is requested , thx again ,and good work sir