Android 在一个框架中创建多个部分,并使每个部分单独工作

Android 在一个框架中创建多个部分,并使每个部分单独工作,android,android-layout,image-processing,xml-layout,Android,Android Layout,Image Processing,Xml Layout,我一直在开发一个类似于的应用程序,我是如何成功地执行此任务并创建代码来制作这样的帧的,我使用了一个多点触控视图类,它是 多点触控视图类 import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.gra

我一直在开发一个类似于的应用程序,我是如何成功地执行此任务并创建代码来制作这样的帧的,我使用了一个多点触控视图类,它是

多点触控视图类

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;


/**
 * Canvas View for the MultiTouch controller
 * @author 2dwarfs.com
 *
 */

public class MultiTouchView extends View implements MultiTouchObjectCanvas<PinchWidget> {

    private static final int UI_MODE_ROTATE = 1;
    private static final int UI_MODE_ANISOTROPIC_SCALE = 2;
    private int mUIMode = UI_MODE_ROTATE;
    ArrayList<PinchWidget> alist = new ArrayList<PinchWidget>();

    private MultiTouchController<PinchWidget> mMultiTouchController = new MultiTouchController<PinchWidget>(this);

    private int mWidth, mHeight;

    private PinchWidget mPinchWidget;
    private Context mContext;

    public MultiTouchView(Context context) {
        super(context);
        //mContext = context;
    }

    public void clearCache(){
        alist.clear();
    }

    public MultiTouchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    public MultiTouchView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setPinchWidget(Bitmap bitmap) {
        mPinchWidget = new PinchWidget(bitmap);
         alist.add(mPinchWidget);
        mPinchWidget.init(mContext.getResources());
        invalidate();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        mWidth = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        mHeight = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(mWidth, mHeight);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.TRANSPARENT);
        for(PinchWidget mmPinchWidget : alist )
           mmPinchWidget.draw(canvas);

    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return mMultiTouchController.onTouchEvent(ev);
    }

    @Override
    public PinchWidget getDraggableObjectAtPoint(PointInfo pt) {
        float x = pt.getX(), y = pt.getY();
        for(PinchWidget mPinchWidget : alist) {
        if (mPinchWidget.containsPoint(x, y)) {
            return mPinchWidget;
        }
        }

        return null;
    }

    @Override
    public void getPositionAndScale(PinchWidget pinchWidget, PositionAndScale objPosAndScaleOut) {
        objPosAndScaleOut.set(pinchWidget.getCenterX(), pinchWidget.getCenterY(), 
                (mUIMode & UI_MODE_ANISOTROPIC_SCALE) == 0,
                (pinchWidget.getScaleFactor() + pinchWidget.getScaleFactor()) / 2, 
                (mUIMode & UI_MODE_ANISOTROPIC_SCALE) != 0, 
                pinchWidget.getScaleFactor(), 
                pinchWidget.getScaleFactor(),
                (mUIMode & UI_MODE_ROTATE) != 0, 
                pinchWidget.getAngle());
    }

    @Override
    public boolean setPositionAndScale(PinchWidget pinchWidget, PositionAndScale newImgPosAndScale, PointInfo touchPoint) {
        boolean ok = pinchWidget.setPos(newImgPosAndScale, mUIMode, UI_MODE_ANISOTROPIC_SCALE, touchPoint.isMultiTouch());
        if(ok) {
            invalidate();
        }

        return ok;
    }

    @Override
    public void selectObject(PinchWidget pinchWidget, PointInfo touchPoint) {
        if(touchPoint.isDown()) {
            mPinchWidget = pinchWidget;
        }

        invalidate();
    }
}
import java.util.ArrayList;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.util.AttributeSet;
导入android.view.MotionEvent;
导入android.view.view;
/**
*多点触控控制器的画布视图
*@author 2dwarfs.com
*
*/
公共类MultiTouchView扩展视图实现MultitouchObject画布{
专用静态最终内部用户界面模式旋转=1;
专用静态最终内部用户界面模式各向异性比例=2;
私有int mUIMode=UI_模式_旋转;
ArrayList alist=新的ArrayList();
专用多点触控器MMMultiTouchController=新的多点触控器(此);
私人内特米维兹,mHeight;
私有PinchWidget mPinchWidget;
私有上下文;
公共多点触控视图(上下文){
超级(上下文);
//mContext=上下文;
}
公共void clearCache(){
a.clear();
}
公共多点触控视图(上下文、属性集属性){
超级(上下文,attrs);
mContext=上下文;
}
公共多点触控视图(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
公共void setPinchWidget(位图){
mPinchWidget=新的PinchWidget(位图);
alist.add(mPinchWidget);
init(mContext.getResources());
使无效();
}
@凌驾
测量时的保护空隙(内部宽度测量等级、内部高度测量等级){
mWidth=resolveSize(getSuggestedMinimumWidth(),widthMeasureSpec);
mHeight=resolveSize(getSuggestedMinimumHeight(),heightMeasureSpec);
设置测量尺寸(米宽,米高);
}
@凌驾
公共空白onDraw(画布){
super.onDraw(帆布);
画布。drawColor(颜色。透明);
for(PinchWidget mmPinchWidget:alist)
mmPinchWidget.draw(画布);
}
@凌驾
公共事件(MotionEvent ev){
返回MMMultiTouchController.onTouchEvent(ev);
}
@凌驾
公共PinchWidget GetDragableObjectAtPoint(PointInfo pt){
浮点x=pt.getX(),y=pt.getY();
for(PinchWidget mPinchWidget:alist){
if(mPinchWidget.containsPoint(x,y)){
返回mPinchWidget;
}
}
返回null;
}
@凌驾
public void getPositionAndScale(PinchWidget-PinchWidget,PositionAndScale-objPosAndScaleOut){
objPosAndScaleOut.set(pinchWidget.getCenterX(),pinchWidget.getCenterY(),
(mUIMode和UI_模式_各向异性_比例)==0,
(pinchWidget.GetScaleActor()+pinchWidget.GetScaleActor())/2,
(mUIMode和UI_模式_各向异性_比例)!=0,
pinchWidget.GetScaleActor(),
pinchWidget.GetScaleActor(),
(mUIMode和UI模式旋转)!=0,
pinchWidget.getAngle());
}
@凌驾
公共布尔设置位置和缩放(PinchWidget PinchWidget,位置和缩放新建imgPosAndScale,PointInfo接触点){
布尔ok=pinchWidget.setPos(newImgPosAndScale、mUIMode、UI_MODE_各向异性_SCALE、touchPoint.isMultiTouch());
如果(确定){
使无效();
}
返回ok;
}
@凌驾
public void selectObject(PinchWidget PinchWidget、PointInfo接触点){
if(touchPoint.isDown()){
mPinchWidget=pinchWidget;
}
使无效();
}
}
并在XMl文件中使用此框架,如

用于两个帧的Two.xml

<?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="fill_parent"
    android:background="@color/transparent"
    android:orientation="horizontal" >

    <com.example.imageframe.MultiTouchView
        android:orientation="horizontal"
        android:id="@+id/firstone"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="5.0dip"
        android:layout_marginLeft="5.0dip"
        android:layout_marginRight="5.0dip"
        android:layout_marginTop="5.0dip"
        android:layout_weight="0.5"
        android:background="@drawable/back" />

    <com.example.imageframe.MultiTouchView
        android:orientation="horizontal"
        android:id="@+id/secondone"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="5.0dip"
        android:layout_marginRight="5.0dip"
        android:layout_marginTop="5.0dip"
        android:layout_weight="0.5"
        android:background="@drawable/back" />

</LinearLayout>

但是在编写代码时,我认为创建和使用这样的帧是一种非常复杂的方法。此外,这些框架的形状特别是方形/矩形,我无法制作边缘弯曲的框架或动态更改框架形状(使框架分区变大/变小或更改框架形状)

为了找到一个合适的解决方案,我已经搜索了每一件事,但没有成功


请尽快指导我动态创建/操作/编辑框架,或提供一些代码片段来实现此类功能。

您可以使用fragment。单独设计布局。例如fragmentNumberOne.xml和fragmentNumberWO.xml

在主要活动的xml中放置框架布局

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
Fragment fragment = new YourFragment();
Bundle args = new Bundle();
args.putInt("fragmentLayout", R.layout.fragmentNumberOne);
fragment.setArguments(args);

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
        .replace(R.id.content_frame, fragment).commit();
创建一个类,如:

public class YourFragment extends Fragment {

public YourFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    int fragmentLayout = getArguments().getInt("fragmentLayout");
    final View rootView = inflater
            .inflate(fragmentLayout, container, false);

    if (fragmentLayout == R.layout.fragmentNumberOne) {
        ...
        write your code here
        ...
    } else if (fragmentLayout == R.layout.fragmentNumberTwo) {
        ...
        write your code here
        ...
    }

    return rootView;
}

您可以将所需视图的可见性设置为“已消失”,否则在需要时可见