Thứ ba, ngày 6 tháng 12 năm 2016

Cách tạo Quick Action Dialog

Ngày đăng: 20/6/2012, 17:4:14AM | Lượt xem: 1,640
Hot!

 

 Hi cả nhà, hôm nay cuối tuần rảnh rỗi viết thử cái tut xem thế nào, lượn qua blog Lorenz's Blog thấy có bài hay quá, quyết tâm viết cái tut luôn

Đây là tut hướng dẫn viết QuickAction Dialog, cả nhà nhìn hình là biết ngay
 
 
Đầu tiên là main activity: VietAndroidNewQuickAction.java
package com.vietandroid.quick.action;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
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.OnDismissListener;
 
public class VietAndroidNewQuickAction extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        ListView list=(ListView)findViewById(R.id.list);
        NewQAAdapter adapter = new NewQAAdapter(this);
        final String[] data = {"Lê Văn Giáp", "Đỗ Minh Thông", "Lê Xuân Chính", "Phạm Đức Trung", "Chim Song Sóc"};
        adapter.setData(data);
        list.setAdapter(adapter);
        //Action
        final ActionItem addAction = new ActionItem();
         
        addAction.setTitle("Thêm vào");
        addAction.setIcon(getResources().getDrawable(R.drawable.ic_add));
 
        final ActionItem accAction = new ActionItem();
         
        accAction.setTitle("Đồng ý");
        accAction.setIcon(getResources().getDrawable(R.drawable.ic_accept));
         
        final ActionItem upAction = new ActionItem();
         
        upAction.setTitle("Tải lên");
        upAction.setIcon(getResources().getDrawable(R.drawable.ic_up));
         
        list.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                final QuickAction mQuickAction     = new QuickAction(view);
                 
                final ImageView mMoreImage         = (ImageView) view.findViewById(R.id.i_more);
                 
                final String text                = data[position];
                 
                mMoreImage.setImageResource(R.drawable.ic_list_more_selected);
                 
                addAction.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(VietAndroidNewQuickAction.this, "Thêm vào: " + text, Toast.LENGTH_SHORT).show();
                         
                        mQuickAction.dismiss();
                    }
                });
 
                accAction.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(VietAndroidNewQuickAction.this, "Đồng ý:  " + text, Toast.LENGTH_SHORT).show();
                         
                        mQuickAction.dismiss();
                    }
                });
                 
                upAction.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(VietAndroidNewQuickAction.this, "Tải lên: " + text, Toast.LENGTH_SHORT).show();
                         
                        mQuickAction.dismiss();
                    }
                });
                 
                mQuickAction.addActionItem(addAction);
                mQuickAction.addActionItem(accAction);
                mQuickAction.addActionItem(upAction);
                 
                mQuickAction.setAnimStyle(QuickAction.ANIM_AUTO);
                 
                mQuickAction.setOnDismissListener(new OnDismissListener() {
                    @Override
                    public void onDismiss() {
                        mMoreImage.setImageResource(R.drawable.ic_list_more);
                    }
                });
                 
                mQuickAction.show();
            }
        });        
         
    }
}
 
NewQAAdapter.java
package com.vietandroid.quick.action;
 
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;
    }
}
 
QuickAction.java
package com.vietandroid.quick.action;
 
import android.content.Context;
 
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
 
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.LinearLayout;
 
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.view.ViewGroup;
 
import java.util.ArrayList;
 
/**
 * Popup window, shows action list as icon and text (QuickContact / Twitter app). 
 * 
 * @author Lorensius. W. T
 */
public class QuickAction extends CustomPopupWindow {
    private final View root;
    private final ImageView mArrowUp;
    private final ImageView mArrowDown;
    private final Animation mTrackAnim;
    private final LayoutInflater inflater;
    private final Context context;
     
    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;
     
    private int animStyle;
    private boolean animateTrack;
    private ViewGroup mTrack;
    private ArrayList<ActionItem> actionList;
     
    /**
     * Constructor
     * 
     * @param anchor  {@link View} on where the popup should be displayed
     */
    public QuickAction(View anchor) {
        super(anchor);
         
        actionList    = new ArrayList<ActionItem>();
        context        = anchor.getContext();
        inflater     = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         
        root        = (ViewGroup) inflater.inflate(R.layout.quickaction, null);
         
        mArrowDown     = (ImageView) root.findViewById(R.id.arrow_down);
        mArrowUp     = (ImageView) root.findViewById(R.id.arrow_up);
         
        setContentView(root);
         
        mTrackAnim     = AnimationUtils.loadAnimation(anchor.getContext(), 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;
            }
        });
             
        mTrack             = (ViewGroup) root.findViewById(R.id.tracks);
        animStyle        = ANIM_AUTO;
        animateTrack    = true;
    }
 
    /**
     * Animate track
     * 
     * @param animateTrack flag to animate track
     */
    public void animateTrack(boolean animateTrack) {
        this.animateTrack = animateTrack;
    }
     
    /**
     * Set animation style
     * 
     * @param animStyle animation style, default is set to ANIM_AUTO
     */
    public void setAnimStyle(int animStyle) {
        this.animStyle = animStyle;
    }
 
    /**
     * Add action item
     * 
     * @param action  {@link ActionItem}
     */
    public void addActionItem(ActionItem action) {
        actionList.add(action); 
    }
     
    /**
     * Show popup window
     */
    public void show () {
        preShow();
 
        int[] location         = new int[2];
         
        anchor.getLocationOnScreen(location);
 
        Rect anchorRect     = new Rect(location[0], location[1], location[0] + anchor.getWidth(), location[1] 
                            + anchor.getHeight());
 
        root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
         
        int rootWidth         = root.getMeasuredWidth();
        int rootHeight         = root.getMeasuredHeight();
 
        int screenWidth     = windowManager.getDefaultDisplay().getWidth();
        //int screenHeight     = windowManager.getDefaultDisplay().getHeight();
 
        int xPos             = (screenWidth - rootWidth) / 2;
        int yPos             = anchorRect.top - rootHeight;
 
        boolean onTop        = true;
         
        // display on bottom
        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);
         
        createActionList();
         
        window.showAtLocation(this.anchor, Gravity.NO_GRAVITY, xPos, yPos);
         
        if (animateTrack) mTrack.startAnimation(mTrackAnim);
    }
     
    /**
     * Set animation style
     * 
     * @param screenWidth Screen width
     * @param requestedX distance from left screen
     * @param onTop flag to indicate where the popup should be displayed. Set TRUE if displayed on top of anchor and vice versa
     */
    private void setAnimationStyle(int screenWidth, int requestedX, boolean onTop) {
        int arrowPos = requestedX - mArrowUp.getMeasuredWidth()/2;
 
        switch (animStyle) {
        case ANIM_GROW_FROM_LEFT:
            window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);
            break;
                     
        case ANIM_GROW_FROM_RIGHT:
            window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);
            break;
                     
        case ANIM_GROW_FROM_CENTER:
            window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);
        break;
                     
        case ANIM_AUTO:
            if (arrowPos <= screenWidth/4) {
                window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);
            } else if (arrowPos > screenWidth/4 && arrowPos < 3 * (screenWidth/4)) {
                window.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);
            } else {
                window.setAnimationStyle((onTop) ? R.style.Animations_PopDownMenu_Right : R.style.Animations_PopDownMenu_Right);
            }
                     
            break;
        }
    }
     
    /**
     * Create action list
     *      
     */
    private void createActionList() {
        View view;
        String title;
        Drawable icon;
        OnClickListener listener;
        int index = 1;
         
        for (int i = 0; i < actionList.size(); i++) {
            title         = actionList.get(i).getTitle();
            icon         = actionList.get(i).getIcon();
            listener    = actionList.get(i).getListener();
     
            view         = getActionItem(title, icon, listener);
         
            view.setFocusable(true);
            view.setClickable(true);
              
            mTrack.addView(view, index);
             
            index++;
        }
    }
     
    /**
     * Get action item {@link View}
     * 
     * @param title action item title
     * @param icon {@link Drawable} action item icon
     * @param listener {@link View.OnClickListener} action item listener
     * @return action item {@link View}
     */
    private View getActionItem(String title, Drawable icon, OnClickListener listener) {
        LinearLayout container    = (LinearLayout) inflater.inflate(R.layout.action_item, null);
        ImageView img             = (ImageView) container.findViewById(R.id.icon);
        TextView text             = (TextView) container.findViewById(R.id.title);
         
        if (icon != null) {
            img.setImageDrawable(icon);
        } else {
            img.setVisibility(View.GONE);
        }
         
        if (title != null) {
            text.setText(title);
        } else {
            text.setVisibility(View.GONE);
        }
         
        if (listener != null) {
            container.setOnClickListener(listener);
        }
 
        return container;
    }
     
    /**
     * Show arrow
     * 
     * @param whichArrow arrow type resource id
     * @param requestedX distance from left screen
     */
    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);
    }
}
 
ActionItem.java
 
package com.vietandroid.quick.action;
 
import android.graphics.drawable.Drawable;
import android.graphics.Bitmap;
 
import android.view.View.OnClickListener;
 
/**
 * Action item, displayed as menu with icon and text.
 * 
 * @author Lorensius. W. L. T
 *
 */
public class ActionItem {
    private Drawable icon;
    private Bitmap thumb;
    private String title;
    private boolean selected;
    private OnClickListener listener;
     
    /**
     * Constructor
     */
    public ActionItem() {}
     
    /**
     * Constructor
     * 
     * @param icon {@link Drawable} action icon
     */
    public ActionItem(Drawable icon) {
        this.icon = icon;
    }
     
    /**
     * Set action title
     * 
     * @param title action title
     */
    public void setTitle(String title) {
        this.title = title;
    }
     
    /**
     * Get action title
     * 
     * @return action title
     */
    public String getTitle() {
        return this.title;
    }
     
    /**
     * Set action icon
     * 
     * @param icon {@link Drawable} action icon
     */
    public void setIcon(Drawable icon) {
        this.icon = icon;
    }
     
    /**
     * Get action icon
     * @return  {@link Drawable} action icon
     */
    public Drawable getIcon() {
        return this.icon;
    }
     
    /**
     * Set on click listener
     * 
     * @param listener on click listener {@link View.OnClickListener}
     */
    public void setOnClickListener(OnClickListener listener) {
        this.listener = listener;
    }
     
    /**
     * Get on click listener
     * 
     * @return on click listener {@link View.OnClickListener}
     */
    public OnClickListener getListener() {
        return this.listener;
    }
     
    /**
     * Set selected flag;
     * 
     * @param selected Flag to indicate the item is selected
     */
    public void setSelected(boolean selected) {
        this.selected = selected;
    }
     
    /**
     * Check if item is selected
     * 
     * @return true or false
     */
    public boolean isSelected() {
        return this.selected;
    }
 
    /**
     * Set thumb
     * 
     * @param thumb Thumb image
     */
    public void setThumb(Bitmap thumb) {
        this.thumb = thumb;
    }
     
    /**
     * Get thumb image
     * 
     * @return Thumb image
     */
    public Bitmap getThumb() {
        return this.thumb;
    }
}
 
CustomPopupWindow.java
package com.vietandroid.quick.action;
 
import android.content.Context;
 
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
 
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
 
import android.widget.PopupWindow;
 
/**
 * This class does most of the work of wrapping the {@link PopupWindow} so it's simpler to use. 
 * Edited by Lorensius. W. L. T
 * 
 * @author qberticus
 * 
 */
public class CustomPopupWindow {
    protected final View anchor;
    protected final PopupWindow window;
    private View root;
    private Drawable background = null;
    protected final WindowManager windowManager;
     
    /**
     * Create a QuickAction
     * 
     * @param anchor
     *            the view that the QuickAction will be displaying 'from'
     */
    public CustomPopupWindow(View anchor) {
        this.anchor = anchor;
        this.window = new PopupWindow(anchor.getContext());
 
        // when a touch even happens outside of the window
        // make the window go away
        window.setTouchInterceptor(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    CustomPopupWindow.this.window.dismiss();
                     
                    return true;
                }
                 
                return false;
            }
        });
 
        windowManager = (WindowManager) anchor.getContext().getSystemService(Context.WINDOW_SERVICE);
         
        onCreate();
    }
 
    /**
     * Anything you want to have happen when created. Probably should create a view and setup the event listeners on
     * child views.
     */
    protected void onCreate() {}
 
    /**
     * In case there is stuff to do right before displaying.
     */
    protected void onShow() {}
 
    protected void preShow() {
        if (root == null) {
            throw new IllegalStateException("setContentView was not called with a view to display.");
        }
         
        onShow();
 
        if (background == null) {
            window.setBackgroundDrawable(new BitmapDrawable());
        } else {
            window.setBackgroundDrawable(background);
        }
 
        // if using PopupWindow#setBackgroundDrawable this is the only values of the width and hight that make it work
        // otherwise you need to set the background of the root viewgroup
        // and set the popupwindow background to an empty BitmapDrawable
         
        window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
        window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
        window.setTouchable(true);
        window.setFocusable(true);
        window.setOutsideTouchable(true);
 
        window.setContentView(root);
    }
 
    public void setBackgroundDrawable(Drawable background) {
        this.background = background;
    }
 
    /**
     * Sets the content view. Probably should be called from {@link onCreate}
     * 
     * @param root
     *            the view the popup will display
     */
    public void setContentView(View root) {
        this.root = root;
         
        window.setContentView(root);
    }
 
    /**
     * Will inflate and set the view from a resource id
     * 
     * @param layoutResID
     */
    public void setContentView(int layoutResID) {
        LayoutInflater inflator =
                (LayoutInflater) anchor.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         
        setContentView(inflator.inflate(layoutResID, null));
    }
 
    /**
     * If you want to do anything when {@link dismiss} is called
     * 
     * @param listener
     */
    public void setOnDismissListener(PopupWindow.OnDismissListener listener) {
        window.setOnDismissListener(listener); 
    }
 
    /**
     * Displays like a popdown menu from the anchor view
     */
    public void showDropDown() {
        showDropDown(0, 0);
    }
 
    /**
     * Displays like a popdown menu from the anchor view.
     * 
     * @param xOffset
     *            offset in X direction
     * @param yOffset
     *            offset in Y direction
     */
    public void showDropDown(int xOffset, int yOffset) {
        preShow();
 
        window.setAnimationStyle(R.style.Animations_PopDownMenu_Left);
 
        window.showAsDropDown(anchor, xOffset, yOffset);
    }
 
    /**
     * Displays like a QuickAction from the anchor view.
     */
    public void showLikeQuickAction() {
        showLikeQuickAction(0, 0);
    }
 
    /**
     * Displays like a QuickAction from the anchor view.
     * 
     * @param xOffset
     *            offset in the X direction
     * @param yOffset
     *            offset in the Y direction
     */
    public void showLikeQuickAction(int xOffset, int yOffset) {
        preShow();
 
        window.setAnimationStyle(R.style.Animations_PopUpMenu_Center);
 
        int[] location = new int[2];
        anchor.getLocationOnScreen(location);
 
        Rect anchorRect =
                new Rect(location[0], location[1], location[0] + anchor.getWidth(), location[1]
                    + anchor.getHeight());
 
        root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
         
        int rootWidth         = root.getMeasuredWidth();
        int rootHeight         = root.getMeasuredHeight();
 
        int screenWidth     = windowManager.getDefaultDisplay().getWidth();
        //int screenHeight     = windowManager.getDefaultDisplay().getHeight();
 
        int xPos             = ((screenWidth - rootWidth) / 2) + xOffset;
        int yPos             = anchorRect.top - rootHeight + yOffset;
 
        // display on bottom
        if (rootHeight > anchor.getTop()) {
            yPos = anchorRect.bottom + yOffset;
             
            window.setAnimationStyle(R.style.Animations_PopDownMenu_Center);
        }
 
        window.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos);
    }
     
    public void dismiss() {
        window.dismiss();
    }
}
 
ChinhLX_Vietandroid.com
 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.