【问题标题】:Drawing on Canvas, Adding Stickers, Custom Bitmaps - Android在画布上绘图、添加贴纸、自定义位图 - Android
【发布时间】:2014-09-17 00:11:55
【问题描述】:

我正在寻求实现一项功能,该功能允许我获取预定义的边框/图像并将它们放置在用户拍摄的图片之上。

此应用与 Aviary 或照片编辑应用的功能非常相似。

我似乎不知道如何在画布或视图上绘制许多图像(比如胡须、鼻子等)。

是否有特定的方法来完成这种堆叠位图/滤镜编辑?我尝试创建自定义视图,但我只能设置 1 个 setContentView();

我的代码现在比较简单,但我只是想知道是否有一种堆叠视图或单独的位图的方法。

public class CustomView extends View {

public CustomView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

public CustomView(Context context, AttributeSet attrs) {
    super(context);
}



@Override
public void onDraw (Canvas canvas) {
    //Draw stuff in here
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.basketball);
    canvas.drawBitmap(bitmap, 0, 0, null);


}

}

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);

    CustomView m_View = new CustomView(this);
    setContentView(m_View);

}

}

【问题讨论】:

    标签: android canvas bitmap drawable


    【解决方案1】:

    这个逻辑可以通过多种方式实现。它基于您的要求和应用程序的详细信息。基本上你可以做类似这样的事情:

    @SuppressLint("WrongCall")
    @Override
    protected void onDraw(Canvas canvas) {
        // use for-int to avoid object (iterator) allocations
        int count = mItems.size();
        for (int i = 0; i < count; i++) {
            mItems.get(i).onDraw(canvas);
        }
    }
    
    ArrayList<Item> mItems;
    
    static class Item {
    
        Context mContext;
        Drawable mDrawable;
        Rect mRect;
        int mResourceId;
    
        // resource ID to point to drawable resources
        public Item(Context context, int resourceId) {
            mContext = context;
            mResourceId = resourceId;
            mRect = new Rect();
        }
    
        public void onDraw(Canvas canvas) {
            // allocate image only when it actually required
            if (mDrawable == null) {
                mDrawable = mContext.getResources().getDrawable(mResourceId);
            }
            // manage mRect to place sticker and etc.
            if (mDrawable != null) {
                mDrawable.setBounds(mRect);
                mDrawable.draw(canvas);
            }
        }
    }
    

    【讨论】:

    • 我需要在用户选择的照片/相机图片上放置单独的“贴纸”或“位图”。这些单独的图像应该是可调整大小/可转动的。
    • 是的,我明白了。例如,您的第一个项目是您的照片。下一项可以是贴纸或任何 mRect 是贴纸区域(x、y、宽度、高度)的地方。
    • 我只需要实现它。我希望允许调整大小/移动贴纸,所以我可能正在寻找自定义的东西来以图形方式操作 mRect。
    • 您认为可以创建一个CustomView 类,并创建该CustomView 的许多实例并动态添加它们吗?视图会相互重叠吗?
    • 您可以使用视图或自定义视图或表面视图来绘制贴纸。真的取决于你。是的,视图重叠,问题是您是否需要将其渲染成一些结果位图。如果是这样,您将需要编写额外的功能以将所有这些重叠的视图渲染到单个位图。
    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多