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

标签 android android-layout image-processing xml-layout

我一直在开发类似于 Pic Frame 的应用程序, Insta collage一些我如何成功执行此任务并创建代码来制作这样的框架我使用了多点触控 View 类

多点触控 View 类

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();
    }
}

并在 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 来实现这种功能。

最佳答案

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

在您的主要 Activity 的 xml 中放置一个 FrameLayout;

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

在您的 Activity 中;

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;
}

关于android - 在一个框架中创建多个部分并使每个部分单独工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21723068/

相关文章:

android - 如何在 RelativeLayout 中的所有其他 View 后面膨胀/添加 View ?

android - 适用于 Android 的 Mono 的 Xamarin 设计器使用什么主题?

c++ - 使用openCv c++复制图像的一部分

python - 使用 Python OpenCV 从图像中删除边框

matlab - 在 CT 图像中分割肺部和结节

android - 我的应用不适用于 Google Play 上的平板设备

java - 从 Parse.com android 播放音乐

android - 如何降低行高。 (表格布局>表格行)

java - 搜索字符串数组

android - EditText - 如何在 android edittext 中设置默认文本