1. 程式人生 > >Android8.1 Camera2修改ShutterButton,拍照及視訊按鈕修改

Android8.1 Camera2修改ShutterButton,拍照及視訊按鈕修改

Android8.1 Camera2修改ShutterButton,拍照及視訊按鈕修改

一、修改相簿開啟按鈕樣式
host/src/com/mediatek/camera/ui/ThumbnailViewManager.java

private RoundedBitmapDrawable createRoundDrawable(Bitmap bitmap, final int color){

 ......
     /*<20180709 OR by xza 0000092 begin>*/
//        borderPaint.setColor(BORDER_COLOR);
        borderPaint.setColor(Color.parseColor("#ffffff"));
        borderPaint.setStrokeCap(Paint.Cap.BUTT);
        /*<20180709 OR by xza 0000092 end>*/
    ......
        /*<20180709 OR by xza 0000092 begin>*/
//        canvas.drawCircle(canvas.getWidth() / 2, canvas.getWidth() / 2,
//                newBitmapSquareWidth / 2, borderPaint);
        int x=canvas.getWidth()/2;
        int y=canvas.getHeight()/2;
        int r=newBitmapSquareWidth/2;
        canvas.drawRoundRect(x-r,y-r,x+r,y+r,12,12,borderPaint);
        /*<20180709 OR by xza 0000092 end>*/
        ......
        /*<20180709 OR by xza 0000092 begin>*/
//        roundedBitmapDrawable.setCornerRadius(bitmapRadius);
        roundedBitmapDrawable.setCornerRadius(12);
        /*<20180709 OR by xza 0000092 begin>*/
}

二、新增切換mode按鈕
host/res/layout/camera_ui_root.xml

<?xml version="1.0" encoding="utf-8"?>
<com.mediatek.camera.common.widget.RotateLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/app_ui"
    android:splitMotionEvents="false">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout  android:id="@+id/animation_root"...>

        <FrameLayout
            android:id="@+id/camera_ui_root"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <LinearLayout android:id="@+id/top_bar" ...>

                <LinearLayout ...>
                <!--20180709 OR by xza 0000092 layout_width=match_parent layout_marginBottom="18.5dp"-->
                <com.mediatek.camera.ui.shutter.ShutterRootLayout
                    android:id="@+id/shutter_root"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_centerInParent="true"
                    android:layout_marginBottom="38.5dp"></com.mediatek.camera.ui.shutter.ShutterRootLayout>

                <View android:id="@+id/center" .../>
                <LinearLayout android:id="@+id/indicator_view" ...>
                <View android:id="@+id/center_bottom" .../>
                <!--20180709 OR by xza 0000092 begin-->
                <!--新增mode切換按鈕-->
                <ImageView
                    android:id="@+id/shutter_type_button"
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:layout_toRightOf="@id/center_bottom"
                    android:layout_alignParentBottom="true"
                    android:enabled="true"
                    android:clickable="true"
                    android:layout_marginLeft="85dp"
                    android:src="@drawable/shutter_type_video_ruyi"
                    android:layout_marginBottom="38.5dp"
                    android:visibility="gone"
                    android:scaleType="centerInside"/>
                <!--20180709 OR by xza 0000092 end-->

                <!--20180709 OR by xza layout_marginBottom==40dp clickable=true android:layout_above="@+id/shutter_type_button" 0000092-->
                <RelativeLayout
                    android:id="@+id/effect"
                    android:layout_above="@+id/shutter_type_button"
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:layout_alignParentBottom="true"
                    android:layout_marginBottom="140dp"
                    android:layout_marginLeft="117dp"
                    android:layout_toRightOf="@id/center_bottom"
                    android:clickable="false"
                    android:focusable="false"
                    android:scaleType="center">

                </RelativeLayout>
                <!--20180709 OR by xza layout_marginRight=117dp 0000092-->
                <com.mediatek.camera.common.widget.RotateImageView android:id="@+id/thumbnail" />

                <com.mediatek.camera.common.widget.RotateImageView android:id="@+id/thumbnail_animation" ...>
            </RelativeLayout>

            <FrameLayout android:id="@+id/feature_root">

            <FrameLayout android:id="@+id/quick_switcher_option">
        </FrameLayout>
        <FrameLayout android:id="@+id/screen_hint_root" ...>
    </FrameLayout>
</com.mediatek.camera.common.widget.RotateLayout>

三、修改ShutterButtonManager
host/src/com/mediatek/camera/ui/shutter/ShutterButtonManager.java

public class ShutterButtonManager extends AbstractViewManager implements
                                                    ShutterRootLayout.OnShutterChangeListener,
                                                    /*<20180709 OR by xza 0000092>*/
                                                    View.OnClickListener{
    /*<20180709 OR by xza 0000092 begin>*/
    //新增modeName
    private String mShutterName="Picture";
    private  String MODE_TYPE_NORMAL;
    private  String MODE_TYPE_PANO;
    private  String MODE_TYPE_SLOW;
    private ImageView mShutterTypeButton;
    private OnModeChanedShutterLister mOnModeChanedShutterLister;
    //新增mode改變藉口,在CameraAppUI中實現
    public interface OnModeChanedShutterLister{
        void onModeChanged(String modeName,String modeType);
    }
    /*<20180709 OR by xza 0000092 end>*/

    ......

    public ShutterButtonManager(IApp app, ViewGroup parentView) {
        super(app, parentView);
        /*<20180709 OR by xza 0000092 begin>*/
        //初始化modeName
        MODE_TYPE_NORMAL=(String)mApp.getActivity().getResources().getText(R.string.normal_mode_title);
        MODE_TYPE_PANO=(String)mApp.getActivity().getResources().getText(R.string.pano_dialog_title);
        MODE_TYPE_SLOW=(String)mApp.getActivity().getResources().getText(R.string.slow_motion_title);
        /*<20180709 OR by xza 0000092 end>*/
        mShutterButtonListener = new ShutterButtonListenerImpl();
        mInflater = (LayoutInflater) app.getActivity()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    protected View getView() {
        mShutterLayout = (ShutterRootLayout) mApp.getActivity().findViewById(R.id.shutter_root);
        mShutterLayout.setOnShutterChangedListener(this);
        /*<20180709 OR by xza 0000092 begin>*/
        //初始化切換mode按鈕,並且註冊點選事件
        mShutterTypeButton=(ImageView)mApp.getActivity().findViewById(R.id.shutter_type_button);
        mShutterTypeButton.setVisibility(View.VISIBLE);
        mShutterTypeButton.setOnClickListener(this);
        mApp.getAppUi().registerGestureListener(mShutterLayout.getGestureListener(),
                SHUTTER_GESTURE_PRIORITY);
        /*<20180709 OR by xza 0000092 end>*/
        return mShutterLayout;
    }
    ......
    /*<20180709 OR by xza 0000092 begin>*/
    //返回切換mode按鈕
    public View getShutterTypeButton(){
        return mShutterTypeButton;
    }
    /*<20180709 OR by xza 0000092 end>*/
    /*<20180709 OR by xza 0000092 begin>*/
    //set modeChange事件,CameraAppUi中呼叫
    public void setOnModeChanedShutterLister(OnModeChanedShutterLister onModeChanedShutterLister){
        mOnModeChanedShutterLister=onModeChanedShutterLister;
    }
    /*<20180709 OR by xza 0000092 end>*/
}
    /*<20180709 OR by xza 0000092 begin>*/
    //切換mode按鈕點選事件
    @Override
    public void onClick(View v) {
        if(mShutterName.equals("Picture")){
            if (mListener != null) {
                mListener.onShutterTypeChanged("Video");
                mShutterName="Video";
                mShutterTypeButton.setImageResource(R.drawable.shutter_type_photo_ruyi);
                ShutterView shutter = (ShutterView) mShutterLayout.getChildAt(0);
                shutter.setDrawable(mApp.getActivity().getResources().getDrawable(R.drawable.ic_shutter_drawable_video));
                shutter.setName((String)mApp.getActivity().getResources().getText(R.string.shutter_type_video));
            }
        }else if(mShutterName.equals("Video")){
            if (mListener != null) {
                mListener.onShutterTypeChanged("Picture");
                mShutterName="Picture";
                mShutterTypeButton.setImageResource(R.drawable.shutter_type_video_ruyi);
                ShutterView shutter = (ShutterView) mShutterLayout.getChildAt(0);
                shutter.setDrawable(mApp.getActivity().getResources().getDrawable(R.drawable.ic_shutter_drawable_photo));
                shutter.setName((String)mApp.getActivity().getResources().getText(R.string.shutter_type_photo));
            }
        }else if(mShutterName.equals(MODE_TYPE_SLOW)){
            mOnModeChanedShutterLister.onModeChanged(MODE_TYPE_NORMAL,"Picture");
            mShutterName="Picture";
            mShutterTypeButton.setImageResource(R.drawable.shutter_type_video_ruyi);
            ShutterView shutter = (ShutterView) mShutterLayout.getChildAt(0);
            shutter.setDrawable(mApp.getActivity().getResources().getDrawable(R.drawable.ic_shutter_drawable_photo));
            shutter.setName((String)mApp.getActivity().getResources().getText(R.string.shutter_type_photo));
        }else if(mShutterName.equals(MODE_TYPE_PANO)){
            mOnModeChanedShutterLister.onModeChanged(MODE_TYPE_NORMAL,"Video");
            mShutterName="Video";
            mShutterTypeButton.setImageResource(R.drawable.shutter_type_photo_ruyi);
            ShutterView shutter = (ShutterView) mShutterLayout.getChildAt(0);
            shutter.setDrawable(mApp.getActivity().getResources().getDrawable(R.drawable.ic_shutter_drawable_video));
            shutter.setName((String)mApp.getActivity().getResources().getText(R.string.shutter_type_video));
        }
    }
    /*<20180709 OR by xza 0000092 end>*/

    /*<20180709 OR by xza 0000092 begin>*/
    //backPressed事件處理
    private IApp.BackPressedListener mBackPressedListener
            = new IApp.BackPressedListener() {
        @Override
        public boolean onBackPressed() {

            if (mApp.getActivity().getFragmentManager().getBackStackEntryCount() > 0) {
                mApp.getActivity().getFragmentManager().popBackStack();
                return true;
            }else{
                if(!mShutterName.equals("Picture")){
                    if (mListener != null) {
                        mListener.onShutterTypeChanged("Picture");
                        mShutterTypeButton.setImageResource(R.drawable.shutter_type_video_ruyi);
                        mShutterName="Picture";
                        ShutterView shutter = (ShutterView) mShutterLayout.getChildAt(0);
                        shutter.setDrawable(mApp.getActivity().getResources().getDrawable(R.drawable.ic_shutter_drawable_photo));
                        shutter.setName((String)mApp.getActivity().getResources().getText(R.string.shutter_type_photo));
                        shutter.setType("Picture");
                        mOnModeChanedShutterLister.onModeChanged(MODE_TYPE_NORMAL,"Picture");
                    }
                    return true;
                }else{
                    return false;
                }
            }


        }
    };
    /*<20180709 OR by xza 0000092 end>*/
    @Override
    public void onShutterChangedStart(String newShutterName) {
        if (mListener != null) {
            /*<20180709 OR by xza 0000092 begin>*/
            mShutterName=newShutterName;
            /*<20180709 OR by xza 0000092 end>*/
            mListener.onShutterTypeChanged(newShutterName);
        }
    }

    @Override
    public void setEnabled(boolean enabled) {
        ......
        if(mShutterTypeButton!=null){
            /*<20180709 OR by xza 0000092 begin>*/
            mShutterTypeButton.setEnabled(enabled);
            /*<20180709 OR by xza 0000092 end>*/
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (mShutterLayout != null) {
            mShutterLayout.onResume();
        }
        /*<20180709 OR by xza 0000092 begin>*/
        //註冊backParessed事件
        mApp.registerBackPressedListener(mBackPressedListener, IApp.DEFAULT_PRIORITY);
        /*<20180709 OR by xza 0000092 end>*/
    }
    @Override
    public void onPause() {
        super.onPause();
        if (mShutterLayout != null) {
            mShutterLayout.onPause();
        }
        /*<20180709 OR by xza 0000092 begin>*/
        //登出backParessed事件
        mApp.unRegisterBackPressedListener(mBackPressedListener);
        /*<20180709 OR by xza 0000092 end>*/
    }
    public void registerShutterButton(Drawable drawable, String type, int priority) {
        .....
         else if ("Video".equals(type)) {
            /*<20180709 OR by xza 0000092 begin>*/
            //顯示一個shutterbutton
//            item.mShutterName =
//                    (String) mApp.getActivity().getResources().getText(R.string.shutter_type_video);
            item.mShutterName ="";
            /*<20180709 OR by xza 0000092 end>*/
        }

        mShutterButtons.put(priority, item);
    }
    public void registerDone() {
    ......
     /*<20180709 OR by xza 0000092 begin>*/
//            shutterView.setOnShutterTextClickedListener(mShutterLayout);
     /*<20180709 OR by xza 0000092 end>*/
    ......
    }

    public void updateModeSupportType(String currentType, String[] types) {

        for (int i = 0; i < mShutterLayout.getChildCount(); i++) {
            boolean isSupported = false;
                ShutterView shutter = (ShutterView) mShutterLayout.getChildAt(i);
            /*<20180709 OR by xza 0000092 begin>*/
            //顯示一個shutterbutton
//                for (int j = 0; j < types.length; j++) {
//                    if (types[j].equals(shutter.getType())) {
//                        isSupported = true;
//                    }
//                }
//                if (isSupported) {
//                    shutter.setVisibility(View.VISIBLE);
//                } else {
//                    shutter.setVisibility(View.INVISIBLE);
//                }
            if(i==0){
                shutter.setVisibility(View.VISIBLE);
            }else {
                shutter.setVisibility(View.INVISIBLE);
            }
            /*<20180709 OR by xza 0000092 end>*/
        }


        String targetType = null;

        if (types.length == 1) {
            targetType = types[0];
        } else {
            targetType = currentType;
        }
        LogHelper.d(TAG, "currentType = " + currentType + " targetType = " + targetType);
        /*<20180709 OR by xza 0000092 begin>*/
        //顯示一個shutterbutton
//        for (int i = 0; i < mShutterLayout.getChildCount(); i++) {
//                ShutterView shutter = (ShutterView) mShutterLayout.getChildAt(i);
//                if (targetType.equals(shutter.getType())) {
//                    mShutterLayout.updateCurrentShutterIndex(i);
//                }
//        }
        /*<20180709 OR by xza 0000092 >*/
    }

    public void updateCurrentModeShutter(String type, Drawable drawable,String modeName) {
        /*<20180709 OR by xza 0000092 begin>*/
        //顯示一個shutterbutton
//        if (drawable != null) {
//            for (int i = 0; i < mShutterLayout.getChildCount(); i++) {
//                    ShutterView shutter = (ShutterView) mShutterLayout.getChildAt(i);
//                    if (shutter.getType().equals(type)) {
//                        shutter.setDrawable(drawable);
//                    }
//            }
//        } else {
//            for (int i = 0; i < mShutterLayout.getChildCount(); i++) {
//                    ShutterView shutter = (ShutterView) mShutterLayout.getChildAt(i);
//                    ShutterItem item;
//                    for (Integer key : mShutterButtons.keySet()) {
//                        item = mShutterButtons.get(key);
//                        if (shutter.getType().equals(item.mShutterType)) {
//                            shutter.setDrawable(item.mShutterDrawable);
//                        }
//                    }
//            }
//        }
//shutterbutton跟隨mode變化切換圖片
        ShutterView shutter = (ShutterView) mShutterLayout.getChildAt(0);
        if(MODE_TYPE_NORMAL.equals(modeName)){
            mShutterName="Picture";
            mShutterTypeButton.setImageResource(R.drawable.shutter_type_video_ruyi);
            shutter.setDrawable(mApp.getActivity().getResources().getDrawable(R.drawable.ic_shutter_drawable_photo));
            shutter.setName((String)mApp.getActivity().getResources().getText(R.string.shutter_type_photo));
        }else if(MODE_TYPE_PANO.equals(modeName)){
            mShutterName=MODE_TYPE_PANO;
            mShutterTypeButton.setImageResource(R.drawable.shutter_type_video_ruyi);
            shutter.setDrawable(mApp.getActivity().getResources().getDrawable(R.drawable.ic_shutter_drawable_photo));
            shutter.setName(MODE_TYPE_PANO);
        }else if(MODE_TYPE_SLOW.equals(modeName)){
            mShutterName=MODE_TYPE_SLOW;
            mShutterTypeButton.setImageResource(R.drawable.shutter_type_photo_ruyi);
            shutter.setDrawable(mApp.getActivity().getResources().getDrawable(R.drawable.ic_shutter_drawable_video));
            shutter.setName(MODE_TYPE_SLOW);
        }
        /*<20180709 OR by xza 0000092 begin>*/
    }

三、處理ShutterButtonManager
host/src/com/mediatek/camera/ui/CameraAppUI.java

/*<20180709 OR by xza 0000092>*/
private View mShutterTypeButton;
public void onCreate() {
    ......
    /*<20180709 OR by xza 0000092 begin>*/
    //獲取切換mode按鈕
    mShutterTypeButton=mShutterManager.getShutterTypeButton();
    //設定shuttermanager onmodechanger 監聽事件
    mShutterManager.setOnModeChanedShutterLister(new OnModeChanedShutterListerImpl());
    /*<20180709 OR by xza 0000092 end>*/
    ......
}
 @Override
public void registerMode(List<ModeItem> items) {
    ......
    for (int i = 0; i < items.size(); i++) {
        ......
        if (item.mType.equals("Picture")) {
            mShutterManager.registerShutterButton(mApp.getActivity().getResources()
                    .getDrawable(
                            R.drawable.ic_shutter_drawable_photo), "Picture", 0);
        } 
        ......
    }
    ......
}

@Override
public void applyAllUIVisibilityImmediately(int visibility) {
    .......
    /*<20180709 OR by xza 0000092 begin>*/
    mShutterTypeButton.setVisibility(visibility);
    /*<20180709 OR by xza 0000092 end>*/
    .......
}

 private class ConfigUIHandler extends Handler {
      super.handleMessage(msg);
        LogHelper.d(TAG, "handleMessage what =  " + msg.what);
        switch (msg.what) {
            case APPLY_ALL_UI_VISIBILITY:
               ......
                /*<20180709 OR by xza 0000092 begin>*/
                mShutterTypeButton.setVisibility(visibility);
                /*<20180709 OR by xza 0000092 end>*/
                ......
                break;
          .......
        }

}

private void configUIVisibility(int module, int visibility) {
    LogHelper.d(TAG, "configUIVisibility + module " + module + " visibility " + visibility);
    switch (module) {
       ......
        case SHUTTER_BUTTON:
            mShutterManager.setVisibility(visibility);
            /*<20180709 OR by xza 0000092 begin>*/
            mShutterTypeButton.setVisibility(visibility);
            /*<20180709 OR by xza 0000092 end>*/
            break;
       ......
    }
}

private class OnModeChangedListenerImpl implements ModePickerManager.OnModeChangedListener {
    @Override
    public void onModeChanged(String modeName) {
       ......
       //新增modename引數
        /*<20180709 OR by xza 0000092 begin>*/
//            mShutterManager.updateCurrentModeShutter(item.mType, item.mShutterIcon);
            mShutterManager.updateCurrentModeShutter(item.mType, item.mShutterIcon,item.mModeName);
            /*<20180709 OR by xza 0000092 begin>*/
        }
    }
    /*<20180709 OR by xza 0000092 begin>*/
    //ShutterButtonManager onmdeoChanged藉口實現類
    private class OnModeChanedShutterListerImpl implements ShutterButtonManager.OnModeChanedShutterLister{
        @Override
        public void onModeChanged(String modeName,String modeType) {
            if("Picture".equals(modeType)){
                ModeItem item = mModeProvider.getModeEntryName(modeName, modeType);
                mModeChangeListener.onModeSelected(item.mClassName);
                mModePickerManager.updateCurrentModeItem(item);
            }else if("Video".equals(modeType)){
                ModeItem item = mModeProvider.getModeEntryName(modeName, modeType);
                mModeChangeListener.onModeSelected(item.mClassName);
                mModePickerManager.updateCurrentModeItem(item);
            }
        }
    }
    /*<20180709 OR by xza 0000092 begin>*/